// 스트림 API = 함수형 프로그래밍 = 가독성 향상
## 스트림의 주요 개념:
//
// 1.선언적 처리(Declarative Processing):
// 데이터 처리 작업을 선언적으로 정의할 수 있도록 합니다.
// 즉, 무엇을 원하는지를 명시하고, 어떻게 하는지에 대한 세부적인 구현은 숨겨집니다.
//
// 2. 파이프라이닝(Pipelining):
// 스트림 연산을 연결하여 데이터를 다양하게 처리할 수 있습니다.
// 이렇게 연결된 연산들은 연속적으로 처리되며, 중간 연산과 최종 연산으로 나뉩니다.
// 중간 연산(예: filter, map, flatMap)은 스트림을 반환하고,
// 최종 연산(예: forEach, collect, reduce)은 스트림을 소비하고 결과를 생성합니다.
// --> return이 stream인 매서드들을 호출해야 계속 이어질 수 있겠지!!★★★
//
// 3. 지연 평가(Lazy Evaluation):
// 이는 최종 연산이 호출되기 전까지 중간 연산이 실제로 실행되지 않는다는 의미입니다.
// 따라서 불필요한 계산을 피하고 효율성을 높일 수 있습니다.
//
// 4. 병렬 처리(Parallel Processing):
// 스트림은 멀티코어 CPU를 활용하여 데이터를 병렬로 처리하는 기능을 제공합니다.
// 이로 인해 성능을 향상시킬 수 있습니다.
List<Integer> list = new ArrayList<>();
list.add(6);
list.add(8);
list.add(4);
list.add(5);
list.add(11);
// 상황1) 2의배수는 제외하고 출력한다고 가정
// 1. 내가 사용하던 방법
for(int e : list) {
if(e % 2 == 0) {
continue;
}
System.out.println(e);
}
--> 이제는 람다식과 stream을 활용할 수 있겠지
// 2. 함수형프로그래밍
System.out.println("짝수만 나오게해줘");
list.stream()
.filter(e -> e % 2 == 0)
.filter(e -> e != 3)
.forEach(e->System.out.println(e));
;
** filter -> boolean으로, true를 출력하며, 남아야되는 조건을 쓰자.
// --> 짝수인 요소만을 유지하는 조건을 나타내며, 결과로는 짝수만 포함된 리스트가 생성됨
** reduce : 데이터의 축소나 집계 작업을 수행
// 스트림의 요소들을 조합하여 하나의 결과값을 계산하는 데 사용
// --> 곱셈, 문자열 연결, 최댓값 또는 최솟값 찾기 등 다양한 연산에 활용.
// 스트림을 단일 요소로 축소(reduce)하는 데 유용함
// --> 모든 요소를 합산하거나 최댓값 또는 최솟값을 찾는 등의 작업에 활용됨!
// Stream활용2
int sum2 = list.stream()
.filter(e -> e % 2 != 0)
.reduce((a, e) -> a + e)
.orElseThrow(); // --> null값일때 throw로 던져버령
System.out.println(sum2 + " : 중복제외 전 stream활용법");
// if) 중복된 요소를 제거하고 싶을 때
// 방법1)
int sum = 0;
Set<Integer> set = new TreeSet<>();
for(int i : list) {
if(!set.add(i)) continue;
if(i % 2 == 0) {
continue;
}
sum += i;
}
// 방법2)
int sum3 = list.stream()
.distinct() // --> 중복요소 제거 API
.filter(e -> e % 2 == 0)
.reduce((a, e) -> a + e)
.orElseThrow();
System.out.println(sum3 + " : 중복제외 방법2");
**distinct
// 스트림(Stream) API에서 제공하는 중간 연산 중 하나
// 스트림의 요소 중에서 중복된 요소를 제거하여 새로운 스트림을 생성하는 역할
// 중복된 값을 제거하고, 결과로 중복되지 않은 요소로 이루어진 리스트를 생성
'JAVA > DAY 20 _ 23.09.13' 카테고리의 다른 글
Stream활용 예시 (0) | 2023.09.13 |
---|---|
IntStream (0) | 2023.09.13 |
Lambda5_consumer(interface) (0) | 2023.09.13 |
Lambda4_메서드참조 (0) | 2023.09.13 |
Lambda3_구현코드가 한줄일때 활용법 (0) | 2023.09.13 |