본문 바로가기

개발/Java

스트림(Stream)

반응형

스트림(Stream) 이란?


자료의 대상과 관계없이 배열, 컬렉션을 대상으로 동일한 연산을 수행

 

특징

  • 한번 생성하고 사용한 스트림은 소모되기 때문에 재사용을 할 수 없음 → 다른 연산을 수행하기 위해서는 스트림을 재생성해야 함.
  • 스트림 연산은 기존 자료를 변경하지 않음
  • 스트림 연산은 중간 연산과 최종 연산으로 구분 (중간 연산은 여러 개의 연산이 적용될 수 있지만, 최종 연산은 마지막에 한 번만 적용)
최종 연산이 호출되어야 중간 연산에 대한 수행이 이루어지고 그 결과가 만들어짐
따라서 중간 연산에 대한 결과를 연산 중에 알 수 없는데 이를 '지연 연산'이라고 함.

 

스트림 생성과 사용


정수 배열에 연산을 수행하는 예


기존 방식

public class IntArrayTest {

	public static void main(String[] args) {
	
    	int[] arr = {1,2,3,4,5};
        
        for(int num : arr) {
        	System.out.println(num);
        }   
    }
   
}

스트림 생성

public class IntArrayStreamTest {

	public static void main(String[] args) {

		int[] arr = {1,2,3,4,5};
	
		IntStream is = Arrays.stream(arr);
		is.forEach(n->System.out.println(n));

		int sum = Arrays.stream(arr).sum();
		System.out.println(sum);
	}

} 
  • 모든 array들은 arrays 클래스를 활용 가능
  • forEach는 element를 하나씩 꺼내라
  • 처음 시행이 된 is는 소멸하게 되고 int sum을 재생성

중간 연산과 최종 연산


1. 중간 연산

  • 중간 연산의 예 - filter( ), map( ), sorted( ) 등 < 많은 연산이 존재>
  • 최종 연산이 호출될 때 중간 연산이 수행되고 결과가 생성
filter( ) 조건에 맞는 요소를 추출
map( ) 요소를 변환

 

2. 최종 연산

  • 중간 연산과 최종 연산에 대한 구현은 람다식을 활용
  • 스트림이 관리하는 자료를 하나씩 소모해가며 연산이 수행
  • 최종 연산 후에 스트림은 더 이상 다른 연산을 적용할 수 없음
  • 최종 연산의 예 - forEach( ), count( ), sum( ) 등 < 많은 연산이 존재>
forEach( ) : 요소를 하나씩 꺼내 옴
count ( ) : 요소의 개수
sum ( ) : 요소들의 합

 

3. 중간 연산과 최종 연산의 시용


문자열의 길이가 5 이상인 요소만 출력

sList.stream().filter(s->s.length() >= 5).forEach(s->System.out.println(s));
  • 중간 연산 filter( ) , 최종 연산 forEach( )

고객 클래스 배열에서 고객 이름만 가져오기

customerList.stream( ).map(c->c.getName( )).forEach(s->System.out.println(s));
  • 중간 연산 map( ), 최종 연산 forEach( )

 

ArrayLsit 객체에 스트림 생성과 사용


ArrayList에 문자열 자료(이름)를 넣고 이에 대한 여러 연산을 수행

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.print(s+ " "));
		sList.stream().map(s->s.length()).forEach(n->System.out.println(n));
		sList.stream().filter(s->s.length() >= 5).forEach(s->System.out.println(s));
		
	}

}
  • Collection에 대한 Stream을 사용할 때는 Generic type으로 가지고 있는 것을 명시
Stream<String> stream = sList.stream( );
  • 새로운 연산을 수행하기 위해 stream()메서드를 호출하여 스트림을 재생성
반응형

'개발 > Java' 카테고리의 다른 글

Java의 예외 처리하기 - Exception  (0) 2021.05.07
reduce( ) 연산  (0) 2021.05.07
람다식(Lambda expression)  (0) 2021.05.05
내부 클래스(inner class)  (0) 2021.05.04
Map 인터페이스 <HashMap> <TreeMap>  (0) 2021.05.04