22. JAVA 의 스트림(Stream), filter, map, sorted, forEach, collect
스트림(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)과 중간 처리 메소드 , 최종 처리 메소드에 대해 알아보았습니다.
'KoreaIt Academy > JAVA' 카테고리의 다른 글
24. JAVA의 파일 입출력(txt파일로 저장 및 읽기) (0) | 2021.07.29 |
---|---|
23. JAVA의 쓰레드(Thread), 동기화(synchronized), 상태제어(wait, join, sleep, interrupt, interrupted) (0) | 2021.07.28 |
21. JAVA의 컬렉션 프레임워크 - HashSet , HashMap (0) | 2021.07.26 |
20. JAVA의 제네릭, 컬렉션 프레임워크 - LIST (0) | 2021.07.23 |
19. JAVA의 Wrapper 클래스, 박싱(Boxing), 언박싱(UnBoxing) (0) | 2021.07.22 |
댓글