Java Stream API
자바의 Stream API는 컬렉션을 다루는 데 강력한 기능을 제공하여 코드를 더 간결하고 효율적으로 만들어줍니다.
특히, for문을 대체하고 객체를 추출하고 변경하는 작업을 할 때 매우 유용합니다.
이 글에서는 Stream API의 다양한 기능을 예시와 함께 살펴보며 이러한 작업을 어떻게 수행하는지 알아보겠습니다.
1. for문 대체
for문은 반복적인 작업을 수행할 때 많이 사용되지만, Stream API를 사용하면 더 간결하고 가독성이 높은 코드를 작성할 수 있습니다.
예를 들어, 다음과 같은 리스트가 있다고 가정해 봅시다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
이 리스트에서 각 요소를 출력하는 간단한 for문은 다음과 같습니다.
for (int number : numbers) {
System.out.println(number);
}
하지만 Stream API를 사용하면 이를 더 간결하게 표현할 수 있습니다.
numbers.stream().forEach(System.out::println);
Stream의 forEach 메서드를 사용하여 요소를 출력할 수 있습니다.
이렇게 하면 코드가 더 간결해지고 가독성이 향상됩니다.
2. 객체 추출 및 변경
Stream API를 사용하면 컬렉션에서 객체를 추출하고 필요에 따라 변경할 수 있습니다.
예를 들어, 다음과 같은 리스트가 있다고 가정해 봅시다.
List<String> names = Arrays.asList("John", "Alice", "Bob", "David");
이 리스트에서 각 이름의 길이를 구하고 새로운 리스트에 저장하려면 for문을 사용할 수 있습니다.
List<Integer> nameLengths = new ArrayList<>();
for (String name : names) {
nameLengths.add(name.length());
}
하지만 Stream API를 사용하면 이를 한 줄로 간단하게 처리할 수 있습니다.
List<Integer> nameLengths = names.stream()
.map(String::length)
.collect(Collectors.toList());
여기서 map 메서드는 각 요소를 지정된 함수에 매핑하고, collect 메서드는 그 결과를 리스트로 수집합니다.
이렇게 하면 코드가 더 간결하고 선언적이며, 객체를 추출하고 변경하는 과정이 명확하게 드러납니다.
3. 복잡한 작업의 간결한 처리
Stream API를 사용하면 복잡한 작업도 간결하게 처리할 수 있습니다.
예를 들어, 다음과 같은 리스트가 있다고 가정해 봅시다.
List<Integer> nameLengths = names.stream()
.map(String::length)
.collect(Collectors.toList());
이 리스트에서 짝수만 필터링하고 각 값을 제곱한 후 모두 더하려면 다음과 같이 할 수 있습니다.
int sumOfSquaredEvenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * n)
.reduce(0, Integer::sum);
여기서 filter 메서드는 조건에 맞는 요소만 필터링하고, map 메서드는 각 요소를 제곱으로 변환하고,
reduce 메서드는 모든 값을 합산합니다.
이렇게 하면 단 몇 줄의 코드로도 복잡한 작업을 처리할 수 있습니다.
이처럼 Stream API는 for문을 대체하고 객체를 추출하고 변경하는 작업을 효율적으로 처리할 수 있는 강력한 도구입니다.
이를 적절히 활용하면 코드의 가독성을 높이고 유지보수성을 향상할 수 있습니다.