Nulog
article thumbnail
Published 2023. 7. 17. 22:09
[JAVA] Stream(2) 중간연산 JAVA

Stream이란?

배열, 컬렉션의 저장 요소를 하나씩 참조하여 람다식으로 처리할 수 있도록 해주는 반복자.

List, Set, Map, 배열 등 다양한 데이터 소스로부터 Stream을 생성할 수 있다.

생성된 Stream은 풍부한 메서드를 이용해 데이터 소스를 표준화된 방법으로 처리할 수 있다.

 

특징

  • 스트림 처리과정은 생성-중간 연산-최종 연산의 세 단계 파이프라인으로 구성될 수 있다.
  • 원본 데이터 소스를 변경하지 않는다. (Read-only)
  • 일회용이다. (Onetime-only)
  • 스트림은 내부 반복자이다. 

Stream(1) Stream 생성

Stream(2) 중간 연산

Stream(3) 최종 연산

Steram 중간 연산

중간연산을 여러 번 수행 할 수 있다.

Filtering

filter()

특정 조건을 만족하는 요소만 뽑아낸다.

import java.util.Arrays;
import java.util.List;

public class FilteringExample {
    public static void main(String[] args) throws Exception {

        List<String> names = Arrays.asList("홍길동", "임꺽정", "장길산", "전우치","홍길동");
 		
		names.stream()
                .filter(element -> element.startsWith("홍")) // 홍씨 성을 가진 요소만 필터링
                .forEach(element -> System.out.print(element));
        System.out.println();
  
    }
}

// 출력값
홍길동홍길동

distinct()

중복 제거를 위한 메서드이다.

import java.util.Arrays;
import java.util.List;

public class FilteringExample {
    public static void main(String[] args) throws Exception {

        List<String> names = Arrays.asList("홍길동", "임꺽정", "장길산", "전우치","홍길동");
        
        names.stream()
                .distinct() //중복 제거
                .forEach(element -> System.out.print(element));
        System.out.println();
 		
		names.stream()
                .distinct() //중복제거
                .filter(element -> element.startsWith("홍")) // 홍씨 성을 가진 요소만 필터링
                .forEach(element -> System.out.println(element));
  
    }
}

// 출력값
홍길동임꺽정장길산전우치

홍길동

Mapping

map()

Stream 내 값을 변환.

import java.util.Arrays;
import java.util.List;

public class IntermediateOperationExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("coding", "java", "script", "python");
        names.stream()
                .map(element -> element.toUpperCase()) // 요소들을 하나씩 대문자로 변환
                .forEach(element->System.out.println(element));
    }
}

// 출력값
CODING
JAVA
SCRIPT
PYTHON

//
import java.util.Arrays;
import java.util.List;

public class IntermediateOperationExample {
    public static void main(String[] args)
    {
        List<Integer> list = Arrays.asList(1, -2, 3, -4);

        // 각 요소에 3을 곱한 값을 반환
        list.stream().map(number -> number * 3).forEach(System.out::println);
    }

}

// 출력값
3
-6
9
-12

flatmap()

이중, 혹은 그 이상의 다중 중첩 컬렉션 구조 제거 후, 단일 컬렉션으로 변한 후 요소 반환

// 주어진 이중 배열
String[][] namesArray = new String[][]{{"홍길동", "임꺽정"}, {"장길산", "전우치"}};
// map() 사용
        Arrays.stream(namesArray)
                .map(inner -> Arrays.stream(inner))
                .forEach(System.out::println);

// 내부 또한 배열이므로 출력값은 배열의 주소값이 나온다.
java.util.stream.ReferencePipeline$Head@7c30a502
java.util.stream.ReferencePipeline$Head@49e4cb85

// map을 사용하여 Stream 내부를 하나씩 출력할 수 있다.
        Arrays.stream(namesArray)
                .map(inner -> Arrays.stream(inner))
                .forEach(names -> names.forEach(System.out::println));

// 출력값
홍길동
임꺽정
장길산
전우치

//이중이면 간단하게 마무리 되지만, 3중, 4중 구조 등 뎁스가 깊어질 경우 코드는 번거롭고 가독성 저하

// flatMap()을 이용해 간단하게 처리할 수 있다.
Arrays.stream(namesArray).flatMap(Arrays::stream).forEach(System.out::println);

// 출력값
홍길동
임꺽정
장길산
전우치

Sorting

sorted(), 

Stream 내 요소를 오름차순으로 정렬한다.

sorted(Comparator.reverseOrder()

내림차순 정렬

  List<String> names = Arrays.asList("홍길동", "임꺽정", "장길산", "전우치","홍길동");

    names.stream()
              .sorted()
              .forEach(element -> System.out.println(element));

//출력값
임꺽정
장길산
전우치
홍길동
홍길동

    names.stream()
              .sorted(Comparator.reverseOrder())
              .forEach(element -> System.out.println(element));
//출력값
홍길동
홍길동
전우치
장길산
임꺽정

 

기타

Skip(), limit(), peek()

  • skip() : 일부 요소를 건너뛰고 작업을 처리한다.
  • limit() : Stream의 사이즈를 제한한다.
  • peek() : foreach()와 동일하게 요소를 순회하며 특정 작업을 수행한다, 차이점은 foreach()는 최종연산자.

'JAVA' 카테고리의 다른 글

[JAVA] Thread(1) 스레드의 정의와 생성 방법  (0) 2023.07.18
[JAVA] Stream (3) 최종 연산  (0) 2023.07.17
[JAVA] Stream(1) Stream 생성하기  (0) 2023.07.17
[JAVA] Lambda  (0) 2023.07.15
[JAVA] Annotation  (0) 2023.07.14
profile

Nulog

@Nuni0617

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!