백엔드/Java

Java Stream API란?

YoungBLUE 개발일지 2025. 2. 7. 00:48

 

Java Stream API란?

Java8에서 도입된 Stream API는 데이터 처리의 선언적 접근 방식을 제공하여 코드의 가독성과 유지보수성을 향상시켜준다.

다만, 효과적으로 사용하기 위해서는 몇가지 전략적으로 사용해야 제대로 된 사용을 할 수 있다.

 

성능 최적화

Stream 파이프라인의 순서 최적화
예를들어 List에서 원하는 데이터를 뽑아 정렬등을 거친다고 하자.
이럴 때 대상을 줄일 수 있는 filter와 같은 메소드를 앞쪽에서 사용할수록 뒤에서 처리할 데이터의 양이 줄어들게 되므로 보다 효율적인 사용이 가능해진다.

불변성 유지 

예를들어 stream 내부에서 숫자를 증가시킨다던가 외부의 List에 값을 담는 등의 행위는 불변성을 저해할 수 있다.

이때 숫자의 경우 IDE를 사용하면 AtomicInteger 와 같은 타입을 알려줄 것이다.

외부의 List의 담기보다는 자체를 stream을 통해 결과를 .collect(Collectors.toList()) 등의 결과로 처리하자.

스트림의 재사용 불가
Stream은 한 번 사용되면 재사용할 수 없으므로, 필요시 새로운 Stream을 생성하여 사용해야 한다.

flatMap을 통한 중첩 구조 제거
톰 크루즈와 맷데이먼의 이름을 가진 List를 가진 List가 있다고 하자.

List<List<String>> doulbeList = Arrays.asLsit(
	Arrays.asList("Tom", "Cruise"),
    	Arrays.asList("Matt", "Damon")
);

List<String> flatResult = doubleList.stream()
	.flatMap(List::stream)
    	.collect(Collectors.toList());
    
// [Tom, Cruise, Matt, Damon]

이때 flatMap을 사용하면 두개의 List를 하나의 List로 만들 수 있다. 말 그대로 flat이 된다.

 

reduce
reduce는 Stream의 요소를 하나의 결과로 합치는데에 사용된다.

일련의 숫자들을 더하거나 곱하거나 하는 등의 연산이 가능하다.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().reduce(0, Integer::sum);
// 15

 

종료 연산자
정확히 말하자면 종료 연산자라기 보다는 마지막 실행을 해줘야 중간의 연산들까지 모두 실행된다.

Stream<String> stream = Stream.of("a", "b", "c");
stream.filter(s -> s.startsWith("a")); // 실행되지 않음

// 종료 연산 호출
long count = stream.filter(s -> s.startsWith("a")).count();
// 1

 

 

이상으로 실무에서 stream을 사용하면서 알게된 것들과 검색을 통해서 내용을 보충해서 정리해보았다.

반응형

'백엔드 > Java' 카테고리의 다른 글

정규식 사이트 및 예제 RegExr  (3) 2023.05.11