자바 스트림

HG·2022년 10월 28일
0

자바

목록 보기
1/4

Java 스트림

What is Stream

스트림을 이용하면 선언형으로 데이터 처리가 가능 -> 루프와 if 조건문 등의 제어 블록을 사용해서 동작 구현을 지정할 필요없이 선언형 방식으로 동작의 수행을 지정할 수 있다. 선언형 코드와 동작 파라미터화를 활용하면 변하는 요구사항 대응 쉬워진다. 즉, 기존 코드를 복사하여 붙여 넣는 방식을 사용하지 않고 람다 표현식을 이용해 특정 조건의 데이터를 필터링 하는 코드도 쉽게 구현할 수 있다.

filter, sorter, map, collect 같은 여러 빌딩 블록 연산을 연걸해서 복잡한 데이터 처리 파이프라인을 만들 수 있음
여러 연산을 파이프라인으로 연결해도 여전히 가독성/명확성이 유지됨
result of filter method -> result of sorted method -> result of map method -> result of collect method

filter같은 연산은 high-level building block으로 이루어져 있으며, 특정 스레딩 모델에 제한되지 않고 자유롭게 어떤 상황에서든 사용할 수 있다.

일단 스트림이 데이터 컬렉션 반복을 멋지게 처리하는 기능

생성

  • 배열 / 컬렉션 / 빈 스트림

  • Stream.builder() / Stream.generate() / Strea.iterate()

  • 기본 타입형 / String / 파일 스트림

  • 병렬 스트림 / 스트림 연결하기

가공

  • Filtering

  • Mapping

  • Sorting

  • Iterating

결과

  • Calculating

  • Reduction

  • Collecting

  • Matching

  • Iterating

Stream - 람다를 활용하는 기술

기존에는 for문을 돌면서 인스턴스를 다뤘다. 그러나, 로직이 복잡해지면 코드의 양이 많아지고 로직이 섞이고, 메소드를 나누면 여러 루프를 여러 번 돌게된다.

스트림이란 '데이터의 흐름'이다. 배열 or 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있다.

또한, 람다를 이용해 코드의 양을 줄이고 간결하게 표현 가능!

즉, 배열과 컬렉션을 함수형으로 처리할 수 있다.

또 하나의 장점 - 간단하게 병렬처리가 가능

쓰레드를 이용해 많은 요소들을 빠르게 처리할 수 있다.

스트림은 생성 - 가공 -결과 순으로 이루어 진다.

좀더 세분화 하면 [전체] -> [맵핑] -> [필터링] -> [필터링] -> 결과 만들기 -> [결과물] 순으로

#생성하기

보통 배열, 컬렉션을 이용하여 스트림을 만들고, 몇가지 방법이 더 있다.

ㅇ배열 스트림

스트림을 이용하기 위해서 먼저 생성을 해야한다. 스트림은 배열 or 컬렉션 인스턴스를 이용해서 생성할 수 있다.

String[] arr = new String[]{"a","b","c"};
Stream stream = Arrays.stream(arr);
Stream streamOfArrayPart = Arrays.stream(arr, 1, 3);

ㅇ컬렉션 스트림

컬렉션 타입(Collection,List,Set)의 경우 인터페이스에 추가된 디폴트 메소드 stream을 이용해서 스트림을 만들 수 있다.

public interface Collection extends Iterable {
default Stream stream() {
return StreamSupport.stream(spliterator(), false);
}
}
를 만들어 놓으면

List list = Arrays.asList("a", "b", "c");
Stream stream = list.stream();
Stream parallelStream = list.parallelStream(); 병렬 처리 스트림

ㅇStream.builder()

빌더를 사용하면 스트림에 직접적으로 원하는 값을 넣을 수 있다. build 메소드로 스트림을 리턴한다.

Stream builderStream =
Stream.builder()
.add("Eric").add("Elena").add("Java")
.build();

ㅇStream.generate()

generate 메소드를 이용하면 Supplier에 해당하는 람다로 값을 넣을 수 있다. Supplier는 인자는 없고 리턴값만 있는 함수형 인터페이스, 람다에서 리턴하는 값이 들어간다.

public static Stream generate(Supplier s) { }

이 때, 생성되는 스트림은 크기가 정해져있지 않고 무한하기 때문에 특정 사이즈로 최대 크기를 제한해야한다.

Stream generatedStream =
Stream.generate( () -> "gen").limit(5);

ㅇStream.iterate()

profile
Making Body, Making Food, Making Co?de

0개의 댓글