본문 바로가기

개발 이야기/Android (안드로이드)

Java8 Stream API 찍먹하기

320x100

안녕하세요? 사진찍는 개발자입니다.

저번에 이어 JAVA8 Stream API 에 대해 추가적으로 조사한 내용 포스팅합니다.

 

Java Stream API는 자바 8에서 도입된 강력한 기능으로, 데이터 처리의 효율성을 높여줍니다.

이 API를 통해 우리는 배열이나 컬렉션을 쉽게 다룰 수 있으며, 다양한 연산을 통해 원하는 결과를 얻을 수 있습니다.

 

이번 포스팅에서는 Java Stream API의 기본 개념과 함께 고급 기능들을 살펴보겠습니다.

 

 

Java Stream API 개요

 

Java Stream API는 데이터의 흐름을 다루는 기능으로, 함수형 프로그래밍의 개념을 도입하여 데이터를 처리하는 방식을 혁신적으로 변화시켰습니다. 스트림은 데이터 소스(예: 컬렉션, 배열)에서 데이터를 추출하고, 다양한 연산을 통해 가공한 후, 최종 결과를 생성하는 일련의 과정을 제공합니다. 이러한 과정은 코드의 가독성을 높이고, 복잡한 데이터 처리 작업을 간단하게 만들어 줍니다.

 

 

다양한 정렬 방법


Stream API를 사용하면 데이터를 정렬하는 것이 매우 간단합니다. sorted() 메서드를 사용하여 기본 정렬을 수행할 수 있으며, 사용자 정의 정렬도 가능합니다. 예를 들어, 다음과 같은 코드를 통해 리스트를 정렬할 수 있습니다.

 

java

List names = Arrays.asList("John", "Alice", "Bob");
List sortedNames = names.stream()
.sorted()
.collect(Collectors.toList());

 

이 코드는 이름 리스트를 알파벳 순으로 정렬하여 새로운 리스트를 생성합니다. 또한, 정렬 기준을 커스터마이즈하고 싶다면 Comparator를 활용할 수 있습니다. 예를 들어, 문자열의 길이에 따라 정렬할 수 있습니다.

 

java

List sortedByLength = names.stream()
.sorted(Comparator.comparingInt(String::length))
.collect(Collectors.toList());

 

이렇게 다양한 정렬 방법을 통해 원하는 방식으로 데이터를 정렬할 수 있습니다.

 

 

통계 및 집계 함수


Stream API는 통계 및 집계 작업을 수행하는 데 유용한 메서드를 제공합니다. count(), sum(), average(), max(), min() 등의 메서드를 사용하여 데이터의 통계 정보를 쉽게 얻을 수 있습니다. 예를 들어, 다음 코드는 리스트의 요소 개수를 세는 방법입니다.

 

java

long count = names.stream().count();

 

또한, 숫자 리스트의 합계를 구하는 방법은 다음과 같습니다.

 

java

List numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().mapToInt(Integer::intValue).sum();

 

이처럼 Stream API를 활용하면 통계 및 집계 작업을 간편하게 수행할 수 있습니다.

 

 

그룹화와 파티셔닝

 

Stream API는 데이터를 그룹화하거나 파티셔닝하는 기능도 제공합니다. Collectors.groupingBy() 메서드를 사용하여 데이터를 그룹화할 수 있습니다. 예를 들어, 다음 코드는 이름의 첫 글자에 따라 그룹화하는 방법입니다.

 

java

Map<Character, List> groupedByFirstLetter = names.stream()
.collect(Collectors.groupingBy(name -> name.charAt(0)));

 

또한, Collectors.partitioningBy() 메서드를 사용하면 데이터를 두 개의 그룹으로 나눌 수 있습니다. 예를 들어, 다음 코드는 이름의 길이에 따라 그룹을 나누는 방법입니다.

 

java

Map<Boolean, List> partitionedByLength = names.stream()
.collect(Collectors.partitioningBy(name -> name.length() > 3));

 

이러한 기능을 통해 데이터를 효과적으로 관리하고 분석할 수 있습니다.

 

최대/최소값 찾기


Stream API를 사용하면 리스트에서 최대값이나 최소값을 쉽게 찾을 수 있습니다. max()와 min() 메서드를 사용하여 원하는 값을 찾을 수 있습니다. 예를 들어, 다음 코드는 숫자 리스트에서 최대값을 찾는 방법입니다.

 

java

Optional max = numbers.stream().max(Integer::compareTo);

 

이렇게 간단한 코드로도 리스트에서 최대값과 최소값을 쉽게 찾을 수 있습니다.

 

 

병렬 스트림 처리


Stream API는 병렬 처리를 지원하여 대량의 데이터를 효율적으로 처리할 수 있습니다. parallelStream() 메서드를 사용하면 스트림을 병렬로 처리할 수 있습니다. 예를 들어, 다음 코드는 병렬 스트림을 사용하여 리스트의 합계를 구하는 방법입니다.

 

java

int parallelSum = numbers.parallelStream().mapToInt(Integer::intValue).sum();

 

병렬 처리를 통해 성능을 극대화할 수 있지만, 데이터의 일관성을 유지하기 위해 주의가 필요합니다.

 

 

성능 고려사항 및 주의사항


Stream API를 사용할 때 성능을 고려해야 합니다. 특히, 병렬 스트림을 사용할 경우, 데이터의 크기와 처리 방식에 따라 성능이 저하될 수 있습니다. 따라서, 병렬 처리를 사용할 때는 데이터의 특성과 처리 방식에 대한 충분한 이해가 필요합니다. 또한, 스트림은 한 번만 사용할 수 있으므로, 재사용이 필요한 경우에는 리스트로 변환하여 사용해야 합니다.

 

 

마무리 및 추천 자료

 

Java Stream API는 데이터 처리의 효율성을 높여주는 강력한 도구입니다. 다양한 정렬 방법, 통계 및 집계 함수, 그룹화와 파티셔닝, 최대/최소값 찾기, 병렬 스트림 처리 등 다양한 기능을 통해 복잡한 데이터 처리 작업을 간단하게 수행할 수 있습니다. 성능 고려사항과 주의사항을 염두에 두고 활용한다면, 더욱 효과적인 프로그래밍이 가능할 것입니다.

더욱 자세한 내용을 알고 싶다면 아래의 자료를 참고하시기 바랍니다:

 



이런 자료를 참고 했어요.

[1] GitHub - Java 스트림 Stream (1) 총정리 (https://futurecreator.github.io/2018/08/26/java-8-streams/)

[2] 티스토리 - [Java] Stream API의 고급 활용 및 사용 시의 주의할 점 - (4/5) (https://mangkyu.tistory.com/115)

[3] F-Lab - 자바 스트림 API 완벽 가이드 (https://f-lab.kr/insight/java-stream-api-guide)

[4] 티스토리 - [자바 고급 스터디 1주차 - 3부] Stream과 Optional (https://golf-dev.tistory.com/11)

반응형