본문으로 바로가기

[Java] 스트림(Stream)

category Programming/Java 2021. 1. 13. 17:17

스트림이란?

흐름 데이터 세트 간에서 데이터의 전송이 실행되고 있는 것 으로, 문자 형식의 데이터 항목이 연속한 열로 되어 있는 것. 즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리 를 의미하며, 중간 매개자 역할을 한다.

스트림의 특징

  1. 자료의 대상과 관계없이 동일한 연산을 수행
  2. 배열, 컬렉션에 동일한 연산이 수행되어 일관성 있는 처리 가능
  3. 한번 생성하고 사용한 스트림은 재사용 불가
  4. 스트림 연산은 기존 자료를 변경하지 않음
  5. 중간 연산과 최종 연산으로 구분
  6. 최종 연산이 수행되어야 모든 연산이 적용되는 지연 연산

스트림 문법 - 중간 연산

  • filter(), map()

  • 문자열의 길이가 5 이상인 요소만 출력

    sList.stream().filter(s -> s.length() >= 5).forEach(s -> System.out.println(s));
  • 고객 클래스에서 고객 이름만 기져오기

    custList.stream().map(c -> c.getName()).forEach(s -> System.out.println(s));

스트림 문법 - 최종 연산

  • forEach(), count(), sum() 등

    int sum = Arrays.stream(arr).sum();
    int count = (int)Arrays.stream(arr).count();
  • 스트림의 자료를 소모하면서 연산을 수행

  • 최종 연산 후 스트림은 더 이상 다른 연산 불가

스트림 예제

  • List 출력
package stream;

import java.util.ArrayList;  
import java.util.List;  
import java.util.stream.Stream;

public class ArrayListStreamTest {

    public static void main(String[] args) {

        List<String> sList = new ArrayList<String>();
          sList.add("Tomas");
          sList.add("Edward");
          sList.add("Jack");

          Stream<String> stream = sList.stream();
          stream.forEach(s->System.out.print(s + " ")); // Tomas Edward Jack
          System.out.println();

        //최종 연산된 stream은 사용 불가 임으로 새로 생성
        sList.stream().sorted().forEach(s->System.out.print(s + " ")); // Edward Jack Tomas -> Comparable 에 의해 정렬
        System.out.println();

        //길이 수를 가져와 출력
        sList.stream().map(s->s.length()).forEach(n->System.out.println(n)); // 5 6 4
      }
}

reduce() 연산

  1. 정의된 연산이 아닌 프로그래머가 직접 지정하는 연산을 적용
  2. 최종연산으로 스트림의 요소를 소모하며 연산 수행

reduce() 예제

  • 배열의 모든 값의 합
package stream;

import java.util.Arrays;

public class IntArrayTest {

    public static void main(String[] args) {

        int[] arr = {1,2,3,4,5};

        int sum = Arrays.stream(arr).sum();
        System.out.println(sum); // 15

        // 초기값이 0 이며 a,b 를 매개변수로 받아 a+b 합을 루프를 통해 구함
        System.out.println(Arrays.stream(arr).reduce(0, (a,b)->a+b)); // 15
    }
}
  • 문자열 배열에서 가장 긴 문자열을 출력
package stream;

import java.util.Arrays;  
import java.util.function.BinaryOperator;

class CompareString implements BinaryOperator{

    @Override
    public String apply(String s1, String s2) {
        if(s1.getBytes().length >= s2.getBytes().length)
            return s1;
        else return s2;
    }
}

public class ReduceTest {

    public static void main(String[] args) {

        String[] greetings = {"안녕하세요~~~", "hello", "Good morning", "반갑습니다"};

        // 람다식으로 직접 구현
        System.out.println(Arrays.stream(greetings).reduce("", (s1, s2)-> 
            { if(s1.getBytes().length >= s2.getBytes().length)
                  return s1;
              else return s2;
            }));

        // 클래스 구현을 통해 BinaryOperator 를 전달받아 출력
        System.out.println(Arrays.stream(greetings).reduce(new CompareString()).get());
    }
}  

'Programming > Java' 카테고리의 다른 글

[Java] 람다식 (lambda)  (0) 2021.01.13