본문 바로가기
Programming Language/Java

[자바] 스트림

by ggyongi 2021. 10. 27.
반응형

- 스트림 예시

// 스트림 생성
int[] arr = {1, 2, 3, 4, 5};
Arrays.stream(arr).forEach(n -> System.out.println(n));

 

- 스트림 연산

 

중간 연산 - filter(), map()

filter()는 조건을 넣고 그 조건에 맞는 참인 경우만 추출하는 경우에 사용

sList.stream().filter(s->s.length() >= 5).forEach(s-> System.out.println(s));

map()은 특정조건에 해당하는 값으로 변환 시 사용  ex) 클래스가 가진 자료 중 이름만 출력하는 경우에 사용

customerList.stream().map(c-> c.getName()).forEach(s-> System.out.println(s));

최종연산 - forEach(), count(), sum(), reduce()

최종연산은 스트림의 자료를 소모하면서 연산을 수행하기 때문에 최종 연산이 수행되고 나면 해당 스트림은 더이상 사용할 수 없음. 최종 연산은 결과를 만들 때 주로 사용

forEach()는 요소를 하나씩 꺼내는 기능

sum(), count()는 배열 요소 합계를 구한다든가 개수를 출력하는 등의 연산을 수행

 

 

 

- 스트림 생성과 사용

 

1. 정수 배열에 스트림 생성하고 사용하기

package first_project;

import java.util.Arrays;

public class IntArrayTest {

	public static void main(String[] args) {
		int[] arr = {1, 2, 3, 4, 5};
		
		int sumVal = Arrays.stream(arr).sum();
		int count = (int) Arrays.stream(arr).count(); //count() 반환 값이 long이므로 int형으로 변환
		
		System.out.println(sumVal);
		System.out.println(count);

	}

}

결과

15
5

 

2. Collection에서 스트림 생성하고 사용하기

Collection에서 stream() 메서드를 사용하면 이 클래스는 제네릭형을 사용해 다음과 같이 자료형을 명시할 수 있음

Stream<String> stream = sList.stream();

 

package first_project;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class ArrayListStreamTest {

	public static void main(String[] args) {
		List<String> sList = new ArrayList<String>();
		sList.add("Tomas");
		sList.add("Edward");
		sList.add("Jack");
		
		Stream<String> stream = sList.stream(); // 스트림 생성
		stream.forEach(s->System.out.print(s + " ")); // 배열의 요소를 하나씩 출력
		System.out.println();
		
		sList.stream().sorted().forEach(s->System.out.println(s));  // 스트림 새로 생성, 정렬, 요소를 하나씩 꺼내서 출력
	}
}

결과

Tomas Edward Jack 
Edward
Jack
Tomas

 

- 스트림의 특징

1. 자료의 대상과 관계없이 동일한 연산 수행

2. 한 번 생성하고 사용한 스트림은 재사용할 수 없음: 어떤 자료에 대한 스트림을 생성하고 이 스트림에 메서드를 호출하여 연산을 수행했다면 해당 스트림을 다시 다른 연산에 사용할 수 없음

3. 스트림의 연산은 기존 자료를 변경하지 않음: 스트림을 생성하여 정렬한다거나 합을 구하는 등의 여러 연산을 수행한다고 해서 기존 배열이나 컬렉션이 변경되지는 않음

4. 스트림의 연산은 중간 연산과 최종 연산이 있음: 스트림에 중간 연산은 여러 개가 적용될 수 있고, 최종 연산은 맨 마지막에 한번 적용됨. 만약 중간 연산이 여러개 호출되었더라도 최종 연산이 호출되어야 스트림의 중간 연산이 모두 적용됨

 

 

 

- reduce() 연산 : 프로그래머가 직접 기능을 지정

package first_project;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class ArrayListStreamTest {

	public static void main(String[] args) {
		String[] greetings = {"안녕하세요", "hello", "good morning", "반갑습니다^^", "하이"};
		String answer = new String();
		
		answer = Arrays.stream(greetings).reduce("..",(s1, s2) ->{
			System.out.print("s1: "+s1);
			System.out.println(" s2: "+s2);
			if(s1.getBytes().length >= s2.getBytes().length)
				return s1;
			else return s2;});
		
		System.out.println(answer);
	}
}

결과

s1: .. s2: 안녕하세요
s1: 안녕하세요 s2: hello
s1: 안녕하세요 s2: good morning
s1: good morning s2: 반갑습니다^^
s1: good morning s2: 하이
good morning

 

 

 

- 스트림의 활용

package first_project;

public class TravelCustomer {
	private String name;
	private int age;
	private int price;
	
	public TravelCustomer(String name, int age, int price) {
		super();
		this.name = name;
		this.age = age;
		this.price = price;
	}

	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

	public int getPrice() {
		return price;
	}

	@Override
	public String toString() {
		return "TravelCustomer [name=" + name + ", age=" + age + ", price=" + price + "]";
	}
	
	
}

 

package first_project;

import java.util.ArrayList;
import java.util.List;

public class TravelTest {
	public static void main(String[] args) {
		TravelCustomer customerLee = new TravelCustomer("이순신", 40, 100);
		TravelCustomer customerKim = new TravelCustomer("김유신", 20, 100);
		TravelCustomer customerHong = new TravelCustomer("홍길동", 13, 50);
		
		List<TravelCustomer> customerList = new ArrayList<>();
		customerList.add(customerLee);
		customerList.add(customerKim);
		customerList.add(customerHong);
		
		System.out.println("== 고격 명단 추가된 순서대로 출력==");
		customerList.stream().map(c->c.getName()).forEach(s->System.out.println(s));
		
		int total = customerList.stream().mapToInt(c->c.getPrice()).sum();
		System.out.println("총 여행 비용: "+ total);
		
		System.out.println("==20세 이상 고객 명단을 정렬하여 출력");
		customerList.stream().filter(c->c.getAge()>=20).map(c->c.getName()).sorted().forEach(s->System.out.println(s));
		
		
	}
}

결과

== 고격 명단 추가된 순서대로 출력==
이순신
김유신
홍길동
총 여행 비용: 250
==20세 이상 고객 명단을 정렬하여 출력
김유신
이순신
 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글