KoreaIt Academy/JAVA

22. JAVA 의 스트림(Stream), filter, map, sorted, forEach, collect

hongeeii 2021. 7. 27.
728x90
반응형

스트림(Stream)은 컬렉션(배열포함)의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자입니다.


스트림의 특징

람다식으로 요소 처리 코드를 제공합니다.

☞ Stream이 제공하는 대부분의 요소 처리 메소드는 함수적 인터페이스 매개 타입을 가지기 때문에  람다식 또는 메소드 참조를 이용해서 요소 처리 내용을 매개값으로 전달할 수 있습니다.

 

내부 반복자를 사용하므로 병렬 처리가 쉽습니다.

☞ 컬렉션 내부에서 어떻게 요소를 반복시킬 것인가는 컬렉션에게 맡겨두고, 개발자는 요소 처리 코드에만 집중할 수 있습니다.

 

스트림은 중간 처리와 최종 처리를 할 수 있습니다.

☞ 중간 처리에서는 매핑, 필터링, 정렬을 수행하고, 최종 처리에서는 반복, 평균, 총합등의 집계 처리를 수행합니다.

 

스트림 얻기

1. 컬렉션으로부터 스트림 얻기

Stream<T> Collection.stream()
List<Student> list = Arrays.asList(new Student("홍길동", 10), new Student("한석봉", 20), new Student("이순신", 30));
		
Stream<Student> stream = list.stream();

 

2. 배열로부터 스트림 얻기

Stream<T>                Arrays.stream(T[])
IntStream
LongStream
DoubleStream
Student[] student= {new Student("홍길동", 10), new Student("한석봉", 20), new Student("이순신", 30)};
		
Stream<Student> stream = Arrays.stream(student);

 

3. 숫자 범위로부터 스트림 얻기

IntStream IntStream.range(int, int) ////////////끝 값 포함 안함
             IntStream.rangeClosed(int, int) //////끝 값 포함 함
IntStream stream = IntStream.range(1, 100); ////////1~99
IntStream stream2 = IntStream.rangeClosed(1, 100); ////////1~100

 

중간 처리와 최종 처리 메소드

Stream filter() 

- 매개값으로 주어진 Predicate가 true를 리턴하는 요소만 필터링합니다.

※ predicate : predicate 함수적 인터페이스는 매개값을 조사하여 true또는 false를 리턴하는 역할을 합니다.

 

Stream<R> map(Function<T,R>)

- 요소를 대체하는 요소로 구성된 새로운 스트림을 리턴합니다.

※ Function 함수적 인터페이스는 매개값을 리턴값으로 매핑(타입 변환) 하는 역할을 합니다.

 

Stream<T> sorted()  : 객체를 Comparable 구현 방법에 따라 정렬

- 요소를 정렬하는 메소드 입니다.

객체 요소일 경우에, 클래스가 Comparable을 구현하지 않으면 ClassCastException이 발생하기 때문에 

compareTo메소드를 재정의 해줘야 합니다.

 

void forEach()

- 요소 전체를 반복합니다.

 최종 처리 메소드 이므로 이후에 sum()과 같은 다른 최종 메소드를 호출하면 안됩니다.

//1~100까지 중 짝수만 ArrayList에 담고 출력
		ArrayList<Integer> list = new ArrayList<>();
		IntStream.range(1, 101).filter(a->a%2==0).forEach(a->list.add(a));
		System.out.println(list);

 

R collect(Collector<T,A,R> collector)

- 필요한 요소만 컬렉션으로 담을 수 있고, 요소들을 그룹핑할 수 있습니다.

  Collectors 클래스의 정적 메소드

 toList()  //////////// T를 List에 저장
 toSet() //////////// T를  Set에 저장
 toMap(Function<T, K> key, Function<T, U> value) // T를 K와 U로 매핑해서 K를 키로, U를 값으로 Map에 저장
List<Student> maleList = totalList.stream().filter(s -> s.getSex() == Student.Sex.MALE)
				.collect(Collectors.toList());

 


이상으로 스트림(Stream)과 중간 처리 메소드 , 최종 처리 메소드에 대해 알아보았습니다.

728x90
반응형

추천 글