본문 바로가기
SpringBoot

java8-stream

by ByteBridge 2016. 10. 13.
반응형


java8 의 stream 을 컬렉션에 적용 해보기:


List<String> wordList = new ArrayList<>();

wordList.add("test");

wordList.add("test");

wordList.add("test");

wordList.add("aooooasdasdao");

wordList.add("aooooasdasdao");

wordList.add("aooooasdasdao");

long count = wordList.stream().count();

long countByFilter = wordList.stream().filter(w->w.length()>5).count();


stream 은 wordList 의 stream 을 돌려준다.

filter 는 5 보다 큰 단어만 담은 stream 을 리턴 한다.

count 는 이 스트림을 결과로 리듀스 한다.


스트림은 데이터를 변환하고 추출 할 수 있게 해준다.


1. 스트림은 요소들을 보관 하지 않는다. 요소들은 하부의 컬렉션에 보관 되거나 필요할 때 생성 됨.

2. 스트림 연산은 원본을 변경하지 않는다.대신 결과를 담은 새로운 스트림을 반환 한다.

3. 스트림 연산은 가능 하면 지연 처리된다.

(지연 처리란 ? 결과가 필요하기 전에는 실행되지 않음을 의미 한다.

 예를 들어 긴 단어를 모두 세는 대신 처음 5개 긴 단어를 요청 하면, filter 메서드는 5번째 일 치 후 필터링을 중단한다.)


stream 병렬 처리( parallel)


long parallelCount = wordList.parallelStream()

.filter(a->a.length()>5).count();


위와 같이 하게 되면 스트림 라이브러리가 필터링과 카운팅을 병렬로 수행 하게 할 수 있다.


스트림은 "어떻게가 아니라 , 무엇을" 원칙으로 한다.

즉 긴 단어를 골라내고 개수를 센다 와 같이 무엇을 해야 하는지 기술 한다


스트림을 사용하여 작업 할 경우 파이프라인(|) 은 3 단계로 설정:

1. 스트림을 생성 ( stream or parallelStream )

2. 초기 스트림을 다른 스트림으로 변환 하는 중간 연산들을 하나 이상의 단계로 지정.

(filter 메서드로 스트림을 변환)

3. 최종 현산을 적용.앞선 지연 연산들의 실행을 강제 한다. 이후로는 해당 스트림을 더는 사용 불가.

count는 최종 연산이 됨.

스트림 연산들은 요소를 대상으로 실행 될때 호출된 순서로 실행되지 않는다.

즉 예제와 같이 최종 연산인 count 가 호출되기 전까지는 아무 일도 일어 나지 않는다.

count 메서드가 첫번째 요소를 요청하면 , filter 메서드가 길이가 5보다 큰 요소를 찾을때까지 요소들을 요청하기 시작한다.


스트림 값들을 단순히 출력하거나 반복적으로 가져와 어떤 작업을 하고 싶을 경우: forEach 사용

wordList.stream().forEach(System.out::println);


filter 메서드의 인자는 Predicate 컬렉션타입을 인자로 받는다

Predicate 는 boolean 값을 리턴 하는 nondefault 메서드 한 개를 포함 하는 인터페이스 이다.


스트림 null 검사

if(wordList.stream().anyMatch(Objects::isNull))


스트림의 모든 null 삭제

wordList.stream().anyMatch(Objects::nonNull);



반응형