[Java] 2.Stream

Java Stream

자바8 부터 추가된 컬렉션, 배열 등을 순회하며 함수형 인터페이스인 람다식을 적용하여 반복 처리 할수 있도록 해주는 기능

Stream은 다음 3가지의 과정을 지나 사용한다.

  1. Stream 생성
  2. Stream 가공
  3. 결과 반환

1. Stream 생성

순회 할 Array나 Collection을 준비해두고 stream() 메서드를 사용하거나 직접 생성해준다.

List<Integer> list = Arrays.asList(1, 2, 3);
Stream<Integer> stream = list.stream();

Stream<Integer> stream = Stream.<Integer>builder()
    .add(1)
    .add(2)
    .add(3)
    .build();

2. Stream 가공

생성 된 Stream을 입맛에 맞게 가공하는 과정이다.

Filter

Predicate를 인자로 받고 boolean을 return 하는 값만 추출합니다.

Stream<Integer> stream = stream.filter(i -> i > 1);

Map

스트림 내 요소들을 변환할 수 있습니다.

Stream<String> stringStream = stream.map(i -> i.toString());

FlatMap

다차원의 구조인 Stream을 Flattening 작업하여 단일 스트림으로 만들어줍니다.

List<List<Integer>> llist = Arrays.asList(
                Arrays.asList(1, 2),
                Arrays.asList(3),
                Arrays.asList(4,5,6));

Stream<Integer> flatStream = llist.stream()
    .flatMap(l -> l.stream());

for (var i : flatStream.toArray()) {
    System.out.println(i);
}

Peek

스트림 내 요소로 특정 연산을 수행한다.

Stream<Integer> stream = stream.peek(System.out::println);

Sorted

정렬

Stream<Integer> stream = stream.sorted(); //오름차순
Stream<Integer> stream = stream.sorted(Comparator.reverseOrder()); //내림차순
Stream<String> stream = stream.sorted(Comparator.comparingInt(String::length));
Stream<MyClass> stream = stream.sorted((m1, m2) -> m1.Value - m2.Value);

Limit

스트림 개수 지정

Stream<Integer> stream = stream.limit(3);

Distinct

중복 제거

Stream<Integer> stream = stream.distinct();

Skip

처음 n 개의 요소를 스킵한다

Stream<Integer> stream = stream.skip(3);

결과 반환

reduce

누적된 값을 구한다.

stream.reduce((a, b) -> a + b);

collect

스트림을 컬렉션으로 변환한다.

List<Integer> list = stream.collect(Collectors.toList());

iterator

반복자를 반환

Iterator<Integer> iter = stream.iterator();

forEach

스트림 요소를 순회하며 연산을 수행한다.

stream.forEach(i -> System.out.println(i));

noneMatch, anyMatch, allMatch

스트림의 모든 요소가 조건을 만족하는지를 boolean 값으로 반환한다.

stream.noneMatch(i -> i > 1);
stream.anyMatch(i -> i > 1);
stream.allMatch(i -> i > 1);

noneMatch : 모든 요소가 조건을 만족하지 않아야 true

anyMatch : 하나 이상의 요소가 조건을 만족하여야 true

allMatch : 모든 요소가 조건을 만족하여야 true