[Java8] Stream API

2024. 7. 31. 21:42· Java
목차
  1. Stream API

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
  1. Stream API
'Java' 카테고리의 다른 글
  • [Java8] Optional API
  • [Java8] Optional
  • [Java8] Stream
  • [Java8] Java8 API의 메소드
나프초
나프초
나프초
뚜벅뚜벅 초초
나프초
전체
오늘
어제
  • All (113) N
    • IT 지식 (14)
    • Spring Framework (25)
    • Java (23)
    • JavaScript (27)
    • Database (4)
    • Network (3)
    • Linux (3) N
    • Git (7)
    • Etc. (1)

블로그 메뉴

  • 홈
  • 방명록
  • 관리

공지사항

인기 글

태그

  • spring
  • js
  • SpringBoot
  • github
  • 네트워크
  • npm
  • javascript
  • 스프링
  • optional
  • Java
  • HTTP
  • runnable
  • git
  • Java8
  • 공부
  • 자기개발
  • HTTP API
  • completablefuture
  • 네트워크입문
  • functional interface

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
나프초
[Java8] Stream API
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.