728x90
루핑(요소를 하나씩 처리: looping)
스트림에서 요소를 하나씩 반복해서 가져와 처리하는 것입니다.

- 매개타입인 Consumer는 함수형 인터페이스입니다. 모든 Consumer는 매개값을 처리(소비)하는 accept() 메소드를 가지고 있습니다.
Consumer<? Super T>를 람다식으로 표현하면 다음과 같습니다.

LoopingExam.java
import java.util.Arrays;
public class LoopingExam {
public static void main(String[] args) {
int[] intArr = {1,2,3,4,5};
//잘못 작성한 경우 peek(중간처리 : 최종처리 부분이 필요합니다)
Arrays.stream(intArr)
.filter(a -> a%2 == 0) // 2의 배수 찾기
.peek(n -> System.out.println(n));
// 최종처리가 없으므로 동작 하지 않습니다.
// peek(중간처리) 뒤에 sum() 최종처리 - 정상처리
int total = Arrays.stream(intArr)
.filter(a -> a%2 == 0) // 2의 배수찾기
.peek(n -> System.out.println(n))
.sum(); // 최종 처리
System.out.println("총합 : " + total + "\n");
// forEach()를 이용해서 반복처리
Arrays.stream(intArr)
.filter(a -> a%2 == 0)
.forEach(n -> System.out.println(n));
//최종 처리이므로 동작합니다.
}
}
결과:
2
4
총합 : 6
2
4
매칭(요소 조건 만족 여부)
- 요소들이 특정 조건에 만족하는지 여부를 조사하는 최종 처리 기능입니다.
- allMatch(), anyMatch(), noneMatch() 메소드는 매개값으로 주어진 Predicate가 리턴하는 값에 따라 true or false를 리턴합니다.

import java.util.Arrays;
public class MatchingExam {
public static void main(String[] args) {
int[] intArr = {2, 4, 6};
boolean result = Arrays.stream(intArr)
.allMatch(a -> a%2 ==0); // 2의 배수인가?
System.out.println("모두 2의 배수인가? " + result);
result = Arrays.stream(intArr)
.anyMatch(a -> a%3 ==0); // 하나라도 3의 배수가 있는가?
System.out.println("하나라도 3의 배수가 있는가? " + result);
result = Arrays.stream(intArr)
.noneMatch(a -> a%3 ==0); //3의 배수가 없는가?
System.out.println("3의 배수가 없는가? " + result);
}
}
결과 :
모두 2의 배수인가? true
하나라도 3의 배수가 있는가? true
3의 배수가 없는가? false
집계(요소 기본 집계)
최종 처리기능으로 요소들을 처리해서 카운팅, 합계, 평균값, 최대값, 최소값 등 하나의 값으로 산출하는것입니다.
스트림이 제공하는 기본 집계
스트림은 카운팅, 최대, 최소, 평균, 합계 등을 처리하는 다음과 같은 최종 처리 메소드를 제공합니다.

- 집계 메소드가 리턴하는 OptionalXXX는 Optional, OptionalDouble, OptionalInt, OptionalLong 클래스를 지칭합니다.
- 이들은 최종값을 저장하는 객체로 get(), getAsDouble(), getAsInt(), getAsLong()을 호출하여 최종값을 얻을수 있습니다.
import java.util.Arrays;
public class AggregateExam {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
// 카운팅
long count = Arrays.stream(arr)
.filter(n->n%2 ==0) //2의 배수
.count(); //2의 배수의 갯수
System.out.println("2의 배수 개수 " + count);
// 총합
long sum = Arrays.stream(arr)
.filter(n->n%2 ==0) //2의 배수
.sum(); //총합
System.out.println("2의 배수의 합 : " + sum);
double avg = Arrays.stream(arr)
.filter(n->n%2 ==0) //2의 배수
.average() //평균
.getAsDouble(); //int 타입을 double 타입으로 변환
System.out.println("2의 배수의 평균 : " + avg);
int max = Arrays.stream(arr)
.filter(n->n%2 ==0) //2의 배수
.max() //최대값
.getAsInt(); //long 타입을 int 타입으로 변환
System.out.println("최대값: " + max);
int min = Arrays.stream(arr)
.filter(n->n%2 ==0) //2의 배수
.min() //최소값
.getAsInt(); //long 타입을 int 타입으로 변환
System.out.println("최소값: " + min);
int first = Arrays.stream(arr)
.filter(n -> n%3 == 0) //3의 배수
.findFirst() //처음으로 나오는 값 찾기
.getAsInt(); //long 타입을 int 타입으로 변환
System.out.println("3의 배수의 처음값 : " + first);
}
}
결과 :
2의 배수 개수 2
2의 배수의 합 : 6
2의 배수의 평균 : 3.0
최대값: 4
최소값: 2
3의 배수의 처음값 : 3
///
OptionalDouble avg = Arrays.stream(arr)
.filter(n->n%2 ==0) //2의 배수
.average(); //평균
System.out.println("2의 배수의 평균 : " + avg);
결과 :
2의 배수의 평균 : OptionalDouble[3.0]
728x90
'JAVA > Java 기초' 카테고리의 다른 글
| 입출력 스트림.java (0) | 2023.01.30 |
|---|---|
| Optional 클래스.java (0) | 2023.01.30 |
| 정렬. java (0) | 2023.01.30 |
| 람다식.java (0) | 2023.01.27 |
| 컬렉션 자료구조3.java (0) | 2023.01.26 |