본문 바로가기
Language/Java

[java8] Stream 연산자 정리

by 돈코츠라멘 2019. 8. 30.

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]

댓글