8월 6일 - JAVA Stream

Yullgiii·2024년 8월 6일
0

JAVA Stream API

Java 8 버전부터 도입된 Stream API는 자바에서 함수형 프로그래밍을 가능하게 해주는 강력한 기능이다. 이는 데이터를 처리하는 방식에 혁신을 가져왔으며, 코드의 간결함과 가독성을 높이는 데 큰 기여를 한다. 특히 람다 표현식과 함께 사용하면 복잡한 데이터 처리 로직을 매우 직관적으로 표현할 수 있다.

Collection vs. Stream

Collection은 모든 값을 메모리에 저장하는 자료구조로, 모든 데이터가 메모리에 미리 준비되어 있어야 한다. 반면에 Stream은 요청할 때만 요소를 계산하여 메모리 사용을 최소화한다. 이러한 차이로 인해 Stream은 데이터를 실시간으로 처리하거나 대량의 데이터를 다룰 때 유리하다.

Collection

  • 데이터를 메모리에 미리 로드한다.
  • 외부 반복을 사용하여 요소를 가져온다.
  • 데이터를 추가하거나 삭제할 수 있다.

Stream

  • 데이터를 요청할 때 계산한다.
  • 내부 반복을 사용하여 데이터를 처리한다.
  • 스트림의 요소는 불변이며 추가하거나 삭제할 수 없다.

Stream을 활용하면 데이터 처리 작업을 간결하고 효율적으로 수행할 수 있다.

외부 반복 vs. 내부 반복

  • 외부 반복: 사용자가 직접 루프를 사용하여 데이터를 반복적으로 처리해야 한다. 이 방식은 명시적이고 직관적이지만, 병렬 처리가 어렵다.

  • 내부 반복: 스트림 라이브러리가 데이터 처리를 대신 수행한다. 병렬 처리가 가능하며, 코드가 간결해진다.

// 외부 반복 예시
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
for (String name : names) {
    System.out.println(name.toUpperCase());
}

// 내부 반복 예시 (Stream 사용)
names.stream()
     .map(String::toUpperCase)
     .forEach(System.out::println);

Stream 연산

스트림 연산은 두 가지로 나뉜다: 중간 연산과 최종 연산.

중간 연산

  • filter: 조건에 맞는 요소만을 남긴다.
  • map: 각 요소를 주어진 함수에 따라 변환한다.
  • limit: 스트림의 크기를 제한한다.
  • skip: 스트림의 처음 n개 요소를 건너뛴다.
  • distinct: 중복을 제거한다.

중간 연산은 스트림을 반환하며, 중첩하여 사용이 가능하다.

최종 연산

  • forEach: 각 요소를 소비하여 처리한다.
  • collect: 스트림을 컬렉션으로 변환한다.
  • reduce: 모든 요소를 결합하여 하나의 값으로 만든다.
  • count: 스트림의 요소 개수를 반환한다.
  • findFirst: 첫 번째 요소를 반환한다.
  • anyMatch: 조건에 맞는 요소가 있는지 확인한다.

최종 연산은 스트림을 소비하여 결과를 반환한다.

Optional 클래스

Optional은 값의 존재 여부를 명확하게 나타내기 위한 컨테이너 클래스다. null로 인한 오류를 방지하고 더 안전한 코드를 작성하는 데 도움을 준다.

Optional<String> optionalName = Optional.of("Alice");
optionalName.ifPresent(System.out::println);  // 값이 있을 때만 출력

Stream 활용 예제

1. map() 예제

List<String> words = Arrays.asList("stream", "api", "java");
List<String> upperCaseWords = words.stream()
                                   .map(String::toUpperCase)
                                   .collect(Collectors.toList());

System.out.println(upperCaseWords);  // [STREAM, API, JAVA]

2. filter() 예제

List<String> words = Arrays.asList("apple", "banana", "cherry");
List<String> filteredWords = words.stream()
                                  .filter(word -> word.startsWith("b"))
                                  .collect(Collectors.toList());

System.out.println(filteredWords);  // [banana]

3. reduce() 예제

Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);
int sum = numbers.reduce(0, Integer::sum);

System.out.println("Sum: " + sum);  // Sum: 15

4. collect() 예제

List<String> words = Arrays.asList("java", "stream", "collect");
String concatenated = words.stream()
                           .collect(Collectors.joining(", "));

System.out.println(concatenated);  // java, stream, collect

So...

Stream API는 자바에서 데이터 처리의 새로운 패러다임을 제공한다. 이를 통해 코드를 더 직관적이고, 간결하게 작성할 수 있으며, 특히 대량 데이터 처리에서 강력한 성능을 발휘할 수 있다. 중간 연산과 최종 연산을 조합하여 복잡한 데이터 흐름을 선언적으로 표현할 수 있으며, 이는 가독성과 유지보수성을 크게 향상시킨다. Streams를 활용하면 병렬 처리도 쉽게 구현할 수 있어, 현대적인 데이터 처리 요구를 충족시키는 데 매우 유용하다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글