Language/Java

[JAVA] 스트림(Stream)

DuL2 2023. 3. 3. 10:18

스트림(Stream)은 Java 8 버전에서 추가된 기능으로 람다를 활용할 수 있는 기능을 말한다. 기존에는 배열과 컬렉션 프레임워크를 다루기 위하여 for문과 foreach 등을 이용했지만 스트림이 추가됨으로써 배열과 컬렉션을 조합하여 원하는 결과를 바로 얻을 수 있다.

 

함수형 프로그래밍이기 때문에 비교적 간결하고 가독성이 좋아진다는 특징이 있고, 쉬운 병렬 처리를 수행할 수 있다.

 

또한, 최근 부각되고 있는 reactive programming에서 사용되는 reactor를 잘 사용하기 위해 스트림에 대한 이해가 필요하기 때문에 중요하다고 할 수 있다. 여기서 Reactor는 Reactive Streams 명세를 기반으로 하는 non-blocking 앱을 개발하기 위한 자바 라이브러리를 말한다.(Spring은 blocking이다.)

 

하지만, 데이터(컬렉션)의 크기가 작다면 스트림 사용으로 인한 성능 차이가 없거나 오히려 좋지 않을 수 있다.

병렬 처리는 스플릿(split)하기 쉬운 컬렉션이어야 의미가 있다. 병렬 처리를 하기 위해서는 하나의 쓰레드로 쪼개는 작업을 수행하게 되는데 이 때 꽤 큰 오버헤드 비용이 발생하기 때문이다.(fork-join framework를 기반으로 쓰레드를 나누게 됨)

 


관련 참고

https://velog.io/@injoon2019/스트림은-항상-좋을까

 

스트림은 항상 좋을까?

https://homoefficio.github.io/2016/06/26/for-loop-%EB%A5%BC-Stream-forEach-%EB%A1%9C-%EB%B0%94%EA%BE%B8%EC%A7%80-%EB%A7%90%EC%95%84%EC%95%BC-%ED%

velog.io

Conference Video - GeeCon 2015 - The Performance Model of Streams in Java 8 - Angelika Langer

 

AngelikaLanger.com - Conference Video - GeeCon 2015 - The Performance Model of Streams in Java 8 - Angelika Langer - Angelika La

Conference Video - GeeCon 2015 - The Performance Model of Streams in Java 8 - Angelika Langer   This presentation was recorded at the GeeCON 2015 conference in Kraków, Poland on May 13-15, 2015.  

www.angelikalanger.com

Java streams vs for loop

 

Java streams vs for loop

Java streams vs for loop I had quite a bit of trouble finding a good article about java streams vs for loops under this name so I guess I’ll have to write it myself. In this article I would li

blog.jdriven.com


스트림 생성과 가공, 반환

스트림을 사용하기 위해서는 먼저 인스턴스를 생성하는 과정이 필요하다. 스트림을 생성하는 방법에는 많은 방법이 있는데 나열하자면 다음과 같다. (컬렉션 스트림, 기본 타입형 스트림, 문자열 스트림, 병렬 스트림(Parallel Stream) 등)

 

예를 들어 Arrays 클래스에서는 스트림으로 변환하는 stream() 메소드를 사용하여 스트림을 생성할 수 있다.

생성된 Stream은 map, forEach 와 같은 다양한 메소드로 가공처리를 하게 되고 마지막으로 원하는 타입의 컬렉션으로 반환하여 사용하면 된다.

 

보통의 경우에는 Collection -> Stream -> Collection 으로의 타입변환이 한번에 이루어지며 데이터가 가공되기 때문에 Stream 클래스 자체를 선언할 일이 거의 없다.

 

 

기본타입 생성

public PrimitiveStream(){
	IntStream intStream = IntStream.range(1,5); // 1~4
	LongStream longStream = LongStream.rangeClosed(1,5); // 1~5
    
	// Int -> Integer boxing
	Stream<Integer> boxedStream = IntStream.range(1,5).boxed;
}

 

builder, generate, interate 메소드를 사용한 스트림 생성

거의 사용하지 않지만 다음과 같이 직접 Stream을 생성할 수도 있다.

	Stream<String> buildStream = Stream.<String>builder()
    	.add("make")
        .add("Stream")
        .add("using")
        .add("builder")
        .build();
        
	Stream<String> generatedStream = Stream.generate(() -> "generate Stream").limit(5);

	Stream<String> iteratedStream = Stream.iterate("iterate", str -> str + " Stream").limit(3);

 

 

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

[JAVA] Map.Entry  (0) 2023.04.21
[JAVA] 스트림(Stream) - 가공  (0) 2023.03.10
[Java] Static, Heap, Stack  (0) 2022.10.18
JAVA - Enum 파헤치기  (0) 2022.07.26
JVM 정리하기!  (0) 2022.07.24