Operations
Stream을 이용한 코드는 계속해서 Dot 연산자로 method chaining을 일으킨다.
Intermediate Operations (중간 연산자)
중간 연산자들은 모두 Stream을 반환하므로 연속적으로 사용할 수 있다. 단, Stream은 게으르므로(Lazy!) 최종 연산이 존재하지 않으면 중간 연산은 실행되지 않는다.
filter
Predicate에 해당하는 Stream 요소를 필터링한다.
List<String> list = new ArrayList<>();
list.add("item4");
list.add("item5");
list.add("item1");
list.add("item2");
list.add("item3");
list.stream().filter(s -> s.endsWith("2"))
.forEach(s -> System.out.println(s)); // result: item2
map
각 요소를 다른 객체로 변환한다.
List<String> list = new ArrayList<>();
list.add("item4");
list.add("item5");
list.add("item1");
list.add("item2");
list.add("item3");
list.stream().filter(s -> s.endsWith("2"))
.map(s -> s.toUpperCase()) // 대문자로 변환
.forEach(s -> System.out.println(s)); // result: ITEM2
reduce
Stream의 요소들을 다른 방법으로 결합하고 싶은 경우에 사용한다.
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
list.add(i);
}
System.out.println(list.stream().reduce((x, y) -> x + y)); // result: Optional[499500]
limit
인자로 전달된 숫자만큼의 요소를 불러온다.
List<String> list = new ArrayList<>();
list.add("item4");
list.add("item5");
list.add("item1");
list.add("item2");
list.add("item3");
list.stream().limit(3)
.forEach(s -> System.out.println(s));
item4
item5
item1
skip
인자로 전달된 숫자만큼의 요소를 건너뛰고 불러온다.
List<String> list = new ArrayList<>();
list.add("item4");
list.add("item5");
list.add("item1");
list.add("item2");
list.add("item3");
list.stream().skip(3)
.forEach(s -> System.out.println(s));
item2
item3
sorted
Stream의 요소들을 정렬한다.
List<String> list = new ArrayList<>();
list.add("item4");
list.add("item5");
list.add("item1");
list.add("item2");
list.add("item3");
list.stream().sorted()
.forEach(s -> System.out.println(s));
item1
item2
item3
item4
item5
distinct
Stream 요소들의 중복을 제거한다.
List<String> list = new ArrayList<>();
list.add("item4");
list.add("item5");
list.add("item1");
list.add("item2");
list.add("item3");
list.add("item3");
list.add("item3");
list.stream().distinct()
.forEach(s -> System.out.println(s));
item4
item5
item1
item2
item3
Terminal Operations (최종 연산자)
Stream을 반환하지 않으므로 method chaining을 계속할 수 없다. 그래서 pipeline의 마지막에 온다.
forEach
Stream의 각 요소에 특정 작업을 실행한다.
List<String> list = new ArrayList<>();
list.add("item4");
list.add("item5");
list.add("item1");
list.add("item2");
list.add("item3");
list.stream().forEach(s -> System.out.println(s));
item4
item5
item1
item2
item3
count
Stream의 요소 개수(type:long)를 반환한다.
List<String> list = new ArrayList<>();
list.add("item4");
list.add("item5");
list.add("item1");
list.add("item2");
list.add("item3");
System.out.println(list.stream().count()); // result: 5
collect
Stream을 Collection 형태로 반환한다.
List<String> list = new ArrayList<>();
list.add("item4");
list.add("item5");
list.add("item1");
list.add("item2");
list.add("item3");
List<String> sortedList = list.stream().sorted().collect(Collectors.toList());
System.out.println(sortedList); // result: [item1, item2, item3, item4, item5]
'Language > Java' 카테고리의 다른 글
[java] Thread 작업 완료 확인 - Future (0) | 2019.09.01 |
---|---|
javaDoc에 샘플코드(xml 등) 작성하기 (0) | 2019.08.31 |
람다식(Lambda Expression) 아주아주 기초 문법 (0) | 2019.08.30 |
[java] RejectExecutionHandler reject policy - 작업 큐(workQueue)가 full인 상태에서의 처리 정책 (0) | 2019.08.30 |
[java8] Stream vs Collection (0) | 2019.08.30 |
댓글