JAVA

[JAVA] 스트림이 동작할 때(생성, 중간 연산, 최종 연산) 사용하는 메서드

정공자씨 2024. 5. 1. 11:30

 

 

스트림이 동작할 때 사용하는 메서드

 

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 객체에 구현된 방법대로
스트림의 요소를 수집함.

 

 

 

 

 

 

 

출처

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com