본문 바로가기

JAVA/DAY 20 _ 23.09.13

Stream_API

// 스트림 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