Stream

Kim·2022년 10월 25일
0

TIL

목록 보기
1/1
post-thumbnail

Java의 Stream은 Java 8부터 지원된 기능이다.
배열이나 컬렉션 인스턴스에 여러 함수들을 조합해 원하는 결과를 필터링할 수 있다. 람다를 이용하여 코드 양을 줄여 간결하게 표현할 수 있다.
또한, 병렬 처리(multi threading)가 가능하다.

💡 스트림에 대한 내용은 3가지로 나눌 수 있다.

  1. 생성 : 스트림 인스턴스 생성
  2. 가공 : 필터링 등 원하는 결과를 만드는 중간 작업
  3. 결과 : 최종적으로 결과를 만들어내는 작업

Stream 생성

스트림을 사용하려면 스트림 객체를 생성해야 한다. 자주 사용하는 컬렉션 객체들은 stream() 메서드를 지원한다.

컬렉션 스트림

컬렉션 타입(Collection, List, Set)의 경우 stream() 메서드를 호출하여 스트림 객체를 만들 수 있다.

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();

배열 스트림

배열의 경우 아래와 같이 Arrays.stream() 메서드를 사용한다.

String[] array = new String[]{"a", "b", "c"};
Stream<String> stream1 = Arrays.stream(array);
Stream<String> stream2 = Arrays.stream(array, 1, 3); // index 1 포함, 3 제외

문자열 스트림

문자열에 대한 스트림을 생성할 수도 있다. 문자열을 구성하고 있는 각각의 문자들의 ASCII 코드 값을 스트림 형태로 출력해준다.

IntStream charsStream = 
	"Stream".chars(); // [83, 116, 114, 101, 97, 109]


특정 구분자를 이용해 문자열을 split한 다음, 각각의 요소들로 스트림을 만들 수 있다.

Stream<String> stringStream = 
	Pattern.compile(", ").splitAsStream("KOR, USA, JPN"); // [KOR, USA, JPN]

빌더 스트림

빌더(Builder)를 사용하면 직접적으로 원하는 값을 넣을 수 있다.

String<String> stream = Stream<String>builder()
                          .add("KOR")
                          .add("USA")
                          .add("JPN")
                          .build();

스트림 연결

Stream.concat 메서드를 사용하여 두 개의 스트림을 연결해 새로운 스트림을 생성할 수 있다.

Stream<String> stream1 = Stream.of("Java", "Python", "C++");
Stream<String> stream2 = Stream.of("PHP", "Java Script", "C");
Stream<String> concat = Stream.concat(stream1, stream2);
// [Java, Python, C++, PHP, Java Script, C]

Stream 가공

Filter

필터(filter)는 스트램 내의 요소들 중에 특정 데이터를 추출하는 역할을 한다.

Stream<T> filter(Predicate<? super T> predicate);

filter() 메서드에 boolean 값을 리턴하는 람다식을 넘겨주게 되고, 추출되는 데이터에 대해 람다식을 적용하여 true가 리턴되는 데이터만을 선별한다.

// List<String> fruit = Arrays.asList("apple", "banana", "cherry");

Stream<String> stream = 
  names.stream()
  .filter(name -> name.contains("a")); // [apple, banana]

스트림의 각 요소에 대해 평가식을 실행하고, 'a'가 포함된 이름만이 들어간 스트림이 리턴된다.

Map

맵(map)은 스트림 내의 요소들을 하나씩 특정 값으로 변환한다.

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

map() 메서드는 값을 변환해주는 람다식을 인자로 받는다.
스트림 내의 값이 input 되어 특정 로직을 거쳐 output이 되어 새로운 스트림에 담기게 된다. 이러한 작업을 Mapping이라 한다.

// List<String> fruit = Arrays.asList("apple", "banana", "cherry");

Stream<String> stream = 
  fruit.stream()
  .map(String::toUpperCase); // [APPLE, BANANA, CHERRY]

스트림 내의 String에 toUpperCase 메서드를 실행해 대문자로 변환된 값들이 담긴 스트림을 리턴한다.

💡 이외의 더 많은 내용이 궁금하다면 아래 참고 자료 링크를 참고하자.


참고 자료

📕 Java 스트림 Stream (1) 총정리

📙 [Java] 자바 스트림(Stream) 사용법 및 예제

0개의 댓글