[Java] 2.Stream
Java Stream
자바8 부터 추가된 컬렉션, 배열 등을 순회하며 함수형 인터페이스인 람다식을 적용하여 반복 처리 할수 있도록 해주는 기능
Stream은 다음 3가지의 과정을 지나 사용한다.
- Stream 생성
- Stream 가공
- 결과 반환
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