Stream API
list 예시로 다양한 stream API를 알아보자.
List<MyName> nameList = new List<>();
nameList.add(new MyName(1, "amy", true));
nameList.add(new MyName(2, "bob", false));
nameList.add(new MyName(3, "chloe", true));
nameList.add(new MyName(4, "chris", false));
nameList.add(new MyName(5, "david", true));
filter(Predicate)
조건에 맞는 데이터만 필터링하여 스트림으로 만든다.
stream pipeline의 filter를 지나갈 때, 들어가는 데이터와 나오는 데이터 모두 MyName 형으로 동일하다.
nameList.stream() //list를 stream 생성
.filter(n -> n.getName().startsWith("c")) //중개 오퍼레이션 filter로 특정 조건으로 필터링
.forEach(n -> System.out.println(n.getId())); //종료 오퍼레이션 forEach로 출력
/*출력 결과
3
4
*/
Map(Function) / FlatMap(Function)
조건에 맞는 데이터만 필터링하여 stream으로 만든다.
stream pipeline의 filter를 지나갈 때, 들어가는 데이터와 나오는 데이터의 형이 다를 수 있다.
- 예) List<Stream<String>>을 String의 스트림으로
nameList.stream() //list를 stream 생성
.map(n -> n.getName()) //중개 오퍼레이션 map으로 MyName의 Name으로만 이루어진 stream 리턴
.forEach(s -> System.out.println(s)); //종료 오퍼레이션 forEach으로 출력
//메소드 레퍼런스로 만들 수 있다.
nameList.stream() //list를 stream 생성
.map(MyName::getName)
.forEach(System.out::println);
/*출력 결과
amy
bob
chloe
chris
david
*/
만약 위의 nameList, 또다른 list를 요소로 갖는 큰 하나의 list가 있다고 가정해보자.
flatMap은 내부 요소를 더 작은 요소로 만들어 stream 형태로 만드는 중개 오퍼레이션이다.
List<List<MyName>> firstList = new ArrayList<>();
firstList.add(nameList);
firstList.add(tempList);
firstList.stream() //firstList를 stream으로 만들면 stream에 List형 요소들이 흐른다.
.flatMap(Collection::stream) //중개 오퍼레이션 flatMap으로 내부 데이터를 꺼내 새로운 stream으로 만든다.
//이 때 stream에 흐르는 타입은 MyName 형이다.
.forEach(n -> System.out.println(n.getId())); //종료 오퍼레이션으로 출력
generate(Supplier) 또는 Iterate(T seed, UnaryOperator)
무제한 스트림을 생성할 수 도 있다. 하지만 종료 오퍼레이션과 함께 쓰지않으면 아무 일도 일어나지 않는다.만약 무제한 스트림을 만들고, 종료 오퍼레이션 forEach로 데이터를 출력하도록 작성한 뒤 실행하면, 무한히 숫자를 출력해야하므로 주의해야한다.
Stream<Integer> iterate = Stream.iterate(10, i->i+1);
limit(long) / skip(long)
스트림을 만든 뒤, 첫 몇개는 스킵할지, 몇개까지 stream으로 생성할지 조건을 둔다.
Stream.iterate(10, i -> i+1) //stream 생성
.skip(10) //처음 10개 스킵
.limit(10) //총 10개까지 생성
.forEach(System.out::println);
/*출력 결과
20
21
22
23
24
25
26
27
28
29
*/
anyMatch(), allMatch(), nonMatch() : 종료형 오퍼레이터
특정 조건에 맞는 데이터가 있는지 확인하여 true/false(boolean)값을 리턴한다.
boolean test = nameList.stream() //stream 생성
.anyMatch(n -> n.getName().contains("ch")); //ch 포함하는 데이터 있는지 참/거짓 값 리턴
boolean test = nameList.stream() //stream 생성
.filter(n -> n.getName().contains("ch")); //ch 포함하는 데이터만 걸러낸다
.map(MyName::getName) //걸러낸 데이터의 이름으로만 stream 생성
.collect(Collectors.toList()); //stream에 흐르는 데이터를 list형으로 만든다
count()
숫자 세기
reduce(identity, BiFunction), collect(), sum(), max()
스트림 데이터를 하나로 뭉친다.
이 포스팅은 더 자바, Java 8 강의를 수강하며 작성되었습니다.
더 자바, Java 8 강의 | 백기선 - 인프런
백기선 | 자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합
www.inflearn.com
'Java' 카테고리의 다른 글
[Java8] Optional API (0) | 2024.08.05 |
---|---|
[Java8] Optional (0) | 2024.08.01 |
[Java8] Stream (0) | 2024.07.28 |
[Java8] Java8 API의 메소드 (0) | 2024.07.25 |
[Java8] 인터페이스 메소드 (2) | 2024.07.22 |