4.(Stream) concat 예제 코드

이월(0216tw)·2024년 5월 16일

concat()

concat 메서드는 입력받은 두 스트림을 연결해 하나의 스트림으로 만들어준다.
이때 lazily concatenated 라는 말이 나오는데, "느긋하게" 생성된다는 의미이다.
즉, 스트림의 파이프라인만 만들고 요소를 처리할 준비만 하고, 실제로 요소를 생성하지는 않는다.

lazily 이유

(1) 메모리 효율성

스트림이 생성되는 시점에는 메모리에 적재되는게 아니므로 메모리 절약이 가능하다.

예) ..concat( 스트림1 , 스트림2).map().filter().forEach()

위 예에서 실제로 요소가 메모리상에 적재되는 시점은 forEach 시점이다(terminal operation)
중간에 있는 map() , filter() 는 중간 연산이기에 이 시점에도 요소는 아직 메모리에 없다.

  • 중간 연산 예 : map() , filter() 등
  • 종단 연산 예 : forEach() , collect() , reduce() 등

(2) 지연 평가 (lazy evaludation)

요소가 필요한 시점까지 생성을 미루기 때문에, 필요한 요소만 생성하고 불필요한 계산을 피할 수 있다.

(3) 무한한 스트림 처리

요소를 무한하게 생성할 수 있다. (결국 나중에 필요한 만큼만 처리되니까)

concat 테스트 코드

@Test
public void concat_테스트() {

    //정적 스트림 생성
    Stream<String> stream1 = Stream.of("숫자1" , "숫자2" , "숫자3" , "숫자4");

	//동적 스트림 생성
    Stream.Builder<String> builder = Stream.builder();
    builder.add("숫자5").add("숫자6").add("숫자7");
    Stream<String> stream2 = builder.build();

    //두 스트림 합치기
    //이시점에는 실제 요소가 메모리 적재된게 아님!!
    Stream<String> concatenatedStream = Stream.concat(stream1 , stream2);

    //이 시점(종단 구간-forEach)에 실제 적재 및 데이터 처리
    concatenatedStream.forEach(System.out::println);
}
출력결과

숫자1
숫자2
숫자3
숫자4
숫자5
숫자6
숫자7
profile
#SQLD강사 #AI개발 #AI강사 #개발자 개발도 하고 강의도 하지만 고민을 제일 많이 합니다

0개의 댓글