스트림이 동작할 때 사용하는 메서드
1. Stream 생성하기
1) 배열 스트림 생성 : Arrays.stream()
String [] strArr = {"A", "B", "C"};
// 배열 스트림 생성
Stream<T> stream = Arrays.stream(strArr);
2) 컬랙션 스트림 생성 : .stream()
List<String> list = Arrays.asList("A", "B", "C");
// 컬랙션 스트림 생성
Stream<T> stream = list.stream();
3) 기본형 타입의 스트림 생성
- range(a, b) : a부터 (b-1)까지의 범위
IntStream stream = IntStream.range(1,7); // [1,2,3,4,5,6]
- rangeClosed(a, b) : a부터 (b)까지의 범위
IntStream stream = IntStream.rangeClosed(1,5); // [1,2,3,4,5], 5를 포함
2. 중간 연산 : Stream 가공하기
1) sorted
- Stream 내의 요소들을 정렬하는 작업
- 기본은 오름차순 정렬
- 별도의 정렬 기준을 사용하고 싶을 때는 Comparator를 사용
List<String> fruits = Arrays.asList(
"strawberry", "apple", "orange", "banana");
fruits.stream()
.sorted()
.forEach(System.out::println); // apple,banana,orange,strawberry
List<String> fruits = Arrays.asList(
"strawberry", "apple", "orange", "banana");
fruits.stream()
.sorted(Comparator.reverseOrder()) // 내림차순
.forEach(System.out::println); // strawberry,orange,banana,apple
2) map
- Stream 내의 각각의 요소를 특정 값으로 변환하는 작업
- 요소의 값을 변환하기 위해서 람다식으로 인자로 받음
List<String> fruits = Arrays.asList(
"strawberry", "apple", "orange", "banana");
fruits.stream()
.map(String::toUpperCase) // 각 문자를 대문자로
.forEach(System.out::println); //STRAWBERRY,APPLE,ORANGE,BANANA
List<String> numList = Arrays.asList(
"1111", "2", "555", "7777777");
numList.stream()
.map(Integer::parseInt) // 문자열 -> 정수로 변환
.forEach(System.out::println);
3) Filter
- if 조건문의 역할을 함
- 스트림 내의 요소들을 조건에 따라서 걸러내는 작업
public static void main(String[] args) {
List<String> list = Arrays.asList("apple","banana","orange");
// Stream의 각 요소(e)에 "ba"를 포함하고 있는 요소 찾기
Stream<String> stream = list.stream()
.filter( e -> e.contains("ba") );
stream.forEach(System.out::println); // banana
}
4) 기타 연산
Stream<String> stream = list.stream()
.distinct() // 중복 제거
.limit(max) // 최대 크기 제한
.skip(n) // idx = 0 ~ n개 skip하기
.peek(System.out::println) // 중간 작업결과 확인
3. 결과 만들기 : 최종 연산
1) forEach
- for문의 역할을 함
- Stream을 돌면서 최종 연산의 결과를 출력
public static void main(String[] args) {
List<String> list = Arrays.asList("banana", "ban", "apple", "orabang");
//결과를 출력 (peek는 중간, forEach는 최종)
list.stream()
.forEach(System.out::println); // banana,ban,apple,orabang
}
2) 계산
- Stream의 요소가 기본형 타입인 경우
- Stream 내의 요소들의 총합, 최대값, 최소값, 평균값, 요소들의 개수를 연산할 수 있음
IntStream stream = list.stream()
.sum() //스트림 요소의 합 반환
.min() //스트림 요소들의 최소값 반환
.max() //스트림 요소들의 최대값 반환
.average() //스트림의 평균값 반환
.count() //스트림 요소 개수 반환
3) reduce
- 첫 번째와 두 번째 요소를 가지고 연산을 수행한 뒤, 그 결과와 세 번째 요소를 가지고 또 다시 연산을 수행하여
- 모든 요소를 소모하여 연산을 수행한 후, 누적된 연산 결과를 반환
4) collcet
- collect() 메소드는 인수로 전달되는 Collectors 객체에 구현된 방법대로 스트림 요소를 수집
- 예를 들어, 스트림 요소를 오름차순으로 정리하여(sort), 스트림 요소를 수집하여 배열(toArray)로 만듦
[ Collectors 메소드 ]
설명 | 메서드 |
스트림을 배열이나 컬렉션으로 변환 | toArray(), toCollection(), toList(), toSet(), toMap() |
요소의 통계와 연산 메소드와 같은 동작을 수행 | counting(), maxBy(), minBy(), summingInt(), averagingInt() |
요소의 소모와 같은 동작을 수행 | reducing(), joining() |
요소의 그룹화와 분할 | groupingBy(), partitioningBy() |
[ 예제 ] collect() 메소드를 이용하여 해당 스트림을 리스트로 변환
public static void main(String[] args) {
List<Integer> list = Arrays.asList(2,100,0,55);
// 인수로 전달되는 Collectors객체에, 구현된 방법(to List)로 요소를 수집
List<Integer> stream = list.stream()
.sorted()
.collect( Collectors.toList() );
Iterator<Integer> iter = stream.iterator();
while(iter.hasNext()) {
System.out.print(iter.next() + " "); // 0 2 55 100
}
}
5) find
- findFirst()와 findAny() 메소드는 해당 스트림에서 첫 번째 요소를 참조하는 Optional 객체를 반환
- findAny() : 가장 먼저 찾은 요소를 반환
- findFirst() : 첫번째 요소를 반환
6) Match
- 특정 조건을 만족하는 요소가 있는지를 체크하여, 체크한 결과를 true/false로 반환
- anyMatch() : 해당 스트림의 일부 요소가 특정 조건을 만족할 경우에 true를 반환
- allMatch() : 해당 스트림의 모든 요소가 특정 조건을 만족할 경우에 true를 반환
- noneMatch() : 해당 스트림의 모든 요소가 특정 조건을 만족하지 않을 경우에 true를 반환
메서드 | 설명 |
void forEach(Consumer<? super T> action) | 스트림의 각 요소에 대해 해당 요소를 소모하여 명시된 동작을 수행함. |
Optional<T> reduce(BinaryOperator<T> accumulator) T reduce(T identity, BinaryOperator<T> accumulator) |
처음 두 요소를 가지고 연산을 수행한 뒤, 그 결과와 다음 요소를 가지고 또다시 연산을 수행함. 이런 식으로 해당 스트림의 모든 요소를 소모하여 연산을 수행하고, 그 결과를 반환함. |
Optional<T> findFirst() Optional<T> findAny() |
해당 스트림에서 첫 번째 요소를 참조하는 Optional 객체를 반환함. (findAny() 메소드는 병렬 스트림일 때 사용함) |
boolean anyMatch(Predicate<? super T> predicate) | 해당 스트림의 일부 요소가 특정 조건을 만족할 경우에 true를 반환함. |
boolean allMatch(Predicate<? super T> predicate) | 해당 스트림의 모든 요소가 특정 조건을 만족할 경우에 true를 반환함. |
boolean noneMatch(Predicate<? super T> predicate) | 해당 스트림의 모든 요소가 특정 조건을 만족하지 않을 경우에 true를 반환함. |
long count() | 해당 스트림의 요소의 개수를 반환함. |
Optional<T> max(Comparator<? super T> comparator) | 해당 스트림의 요소 중에서 가장 큰 값을 가지는 요소를 참조하는 Optional 객체를 반환함. |
Optional<T> min(Comparator<? super T> comparator) | 해당 스트림의 요소 중에서 가장 작은 값을 가지는 요소를 참조하는 Optional 객체를 반환함. |
T sum() | 해당 스트림의 모든 요소에 대해 합을 구하여 반환함. |
Optional<T> average() | 해당 스트림의 모든 요소에 대해 평균값을 구하여 반환함. |
<R,A> R collect(Collector<? super T,A,R> collector) | 인수로 전달되는 Collectors 객체에 구현된 방법대로 스트림의 요소를 수집함. |
출처
'JAVA' 카테고리의 다른 글
[JAVA] 람다 표현식을 사용하는 함수형 인터페이스 (0) | 2024.05.02 |
---|---|
[JAVA] Optional의 개념과 사용법, 주의할 점 (0) | 2024.05.01 |
[JAVA] 스트림 API(특징, 스트림의 동작 흐름, 컬랙션과의 차이) (1) | 2024.05.01 |
[JAVA] 데몬 스레드 알아보기(특징, 사용 방법) (0) | 2024.04.30 |
[JAVA] 람다 표현식이란? (특징, 사용 문법) (0) | 2024.04.30 |