자바 - Stream API 개선 사항

안녕하세요, 미래의 자바 개발자 여러분! 여러분이 여기 있어서 정말 기쁩니다. 오늘 우리는 흥미로운 주제에 대해 다룰 것입니다: 자바의 Stream API 개선 사항입니다. 프로그래밍에 새로운 사람이라면 걱정하지 마세요; 저는 각 개념을 단계별로 안내해 드릴 것입니다. 수년간 많은 학생들을 가르쳐온 경험을 바탕으로 말이죠. 그럼 여러분의 최爱 음료를 한 잔 마시고 편안하게 앉아, 이 자바 여정을 함께 떠나보겠습니다!

Java - Stream API Improvements

Stream API는 무엇인가요?

개선 사항에 앞서 기본 개념을 알아보겠습니다. 자바 8에서 도입된 Stream API는 마법의 컨베이어 벨트와 같은东西입니다. 이 API를 사용하면 컬렉션 객체를 선언적 방식으로 처리할 수 있습니다. 마치 컬러풀한 보석이 가득 찬 상자가 있고, 그것을 정리하거나 세기하거나 파란 보석만 골라내고 싶을 때와 같은 것입니다. Stream API는 이러한 작업을 효율적이고 우아하게 수행해 줍니다.

Stream API 개선 사항

자바는 열심히 공부하고 개선하는 학생처럼 항상 배우고 있습니다. 최근 업데이트로 Stream API가 더욱 좋아졌습니다! 이러한 개선 사항을 하나씩 탐구해 보겠습니다.

takeWhile(Predicate Interface) 메서드

takeWhile 메서드는 독점 클럽의 바텐더처럼 행동하지만, ID를 확인하는 것이 아니라 사용자가 지정한 조건을 확인합니다. 지정된 조건을 만족하는 요소는 계속 스트림에서 가져옵니다.

다음은 그 동작을 보여주는 예제입니다:

List<String> fruits = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");
List<String> result = fruits.stream()
.takeWhile(fruit -> fruit.length() <= 5)
.collect(Collectors.toList());
System.out.println(result);

출력:

[apple]

이 예제에서 takeWhile은 5자 이하인 과일만 골라내는 과일 수집가처럼 행동합니다. "apple"을 가져오지만 "banana"에 도달하면 중단됩니다.

dropWhile(Predicate Interface)

takeWhile이 사람을 들이는 바텐더라면, dropWhile은 사람을 밖으로 몰아내는 바텐더입니다. 조건을 만족하는 요소는 버리고, 그 다음 요소부터는 유지합니다.

다음은 그 작동 방식입니다:

List<Integer> numbers = Arrays.asList(2, 4, 6, 8, 9, 10, 12);
List<Integer> result = numbers.stream()
.dropWhile(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(result);

출력:

[9, 10, 12]

이 경우 dropWhile은 짝수를 피하는 사람처럼 행동합니다. 짝수를 계속 버리다가 9(홀수)에 도달하면 그 이후의 요소를 모두 유지합니다.

iterate 메서드

iterate 메서드는 이야기 생성기와 같습니다. 시작점, 이야기가 계속되어야 하는지 확인하는 방법, 그리고 다음 장을 생성하는 방법을 제공합니다.

다음은 예제입니다:

Stream<Integer> numbers = Stream.iterate(1, n -> n < 100, n -> n * 2);
numbers.forEach(System.out::println);

출력:

1
2
4
8
16
32
64

이 이야기는 1에서 시작하여 100 미만인 동안 각 새로운 숫자가 전체의 두 배가 되도록 진행됩니다. 체스판과 쌀알의 전설과 같은 것입니다!

ofNullable

ofNullable은 신중한 패키지 처리자처럼 행동합니다. null 값을 부드럽게 처리하면서 가장 많이 1개의 요소를 생성하는 스트림을 만듭니다.

다음은 그 작동 방식을 보여주는 예제입니다:

String name = null;
Stream<String> stream = Stream.ofNullable(name);
System.out.println(stream.count());

name = "Alice";
stream = Stream.ofNullable(name);
System.out.println(stream.count());

출력:

0
1

name이 null인 경우 ofNullable은 빈 스트림을 생성합니다. name에 값이 있는 경우에는 해당 값으로 스트림을 생성합니다. 마술사가 존재 여부에 따라 것이 나타나거나 사라지게 하는 것과 같은 것입니다!

모든 것을 함께 사용해 보자

이제 우리가 배운 새로운 도구들을 하나의 예제에 모두 사용해 보겠습니다:

List<String> words = Arrays.asList("The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog");

List<String> result = words.stream()
.dropWhile(word -> word.length() <= 3)
.takeWhile(word -> !word.equals("over"))
.flatMap(word -> Stream.ofNullable(word.toLowerCase()))
.collect(Collectors.toList());

System.out.println(result);

출력:

[quick, brown, fox, jumps]

이 예제에서 우리는 단어 목록을 처리합니다:

  1. 3자 이하인 단어를 버립니다 (dropWhile)
  2. "over"에 도달할 때까지 단어를 가져옵니다 (takeWhile)
  3. 각 단어를 소문자로 변환하고 null 값을 처리합니다 (flatMapofNullable)
  4. 마지막으로 결과를 새로운 목록으로 수집합니다

이것은 "quick brown fox" 문구의 새로운, 더 정교한 버전을 만드는 것과 같은 것입니다!

결론

그렇습니다, 친愛하는 학생 여러분! 우리는 자바의 Stream API에 대한 흥미로운 새로운 개선 사항을 탐구했습니다. 이 도구들은 스트림을 처리하는 데 더 유연하고 강력하게 만들어줍니다. 기억하시기 바랍니다, 새로운 기술을 배우는 것은 연습이 필요합니다. 그러니 두려워 말고 이 메서드들을 자신의 코드에서 실험하고 놀아보세요.

마무리하며, 저는 자주 학생들에게 공유하는 말을 떠올립니다: "프로그래밍에서도, 인생에서도, 지식의 흐름은 결코 끝나지 않습니다. 계속 배우고, 계속 코딩하고, 가장 중요한 것은 즐겁게 지내세요!"

다음 번에 다시 만나요, 행복한 코딩을 기원합니다!

Credits: Image by storyset