🔙뒤로가기

Stream API

자바 8에서는 컬렉션 프레임워크에 Stream API가 도입되었다. Stream API는 컬렉션에 저장된 요소를 람다식을 이용해서 일괄 처리할 수 있도록 하는 기능을 제공한다. 이를 통해 개발자는 데이터의 처리 과정을 명확하고 간결하게 표현할 수 있다.

Stream API는 중간 연산과 최종 연산으로 구분된다. 중간 연산은 필터링, 매핑, 정렬 등의 연산을 수행하고 스트림을 반환하며, 최종 연산은 스트림의 요소를 소비하고 컬렉션, 객체, 기본 타입 등의 결과를 반환하거나 결과를 출력한다.

List<String> names = Arrays.asList("John", "Arya", "Sansa");
names.stream()                         // 스트림 생성
     .filter(name -> name.startsWith("A"))  // 중간 연산 (필터링)
     .forEach(System.out::println);          // 최종 연산 (출력)

forEach 메서드

forEach 메서드도 자바 8에서 도입된 기능으로, 컬렉션의 모든 요소에 대해 주어진 작업을 수행하는 메서드이다. 람다 표현식 또는 메서드 참조를 인자로 받아서 각 요소에 대해 이를 적용한다.

// List<String> 객체를 생성하고, "John", "Arya", "Sansa" 세 개의 String 요소를 추가
List<String> names = Arrays.asList("John", "Arya", "Sansa");

// names 리스트의 모든 요소에 대해 System.out.println 메서드를 호출
// 즉, 각 이름을 출력. 이는 람다 표현식을 이용한 방식
names.forEach(name -> System.out.println(name));

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.forEach(number -> System.out.println(number));

Lambda 표현식

람다 표현식은 자바 8에서 도입된 기능으로, 함수형 인터페이스의 구현을 간결하게 표현할 수 있게 해준다. 이를 통해 개발자는 복잡한 과정 없이 코드를 효율적으로 작성할 수 있게 되었다. 람다 표현식은 주로 컬렉션의 요소를 처리하는 데 사용된다.

위 예제 코드에서 name -> System.out.println(name) 부분은 람다 표현식이라고 부른다. 람다 표현식은 익명 함수(이름 없는 함수)와 같은 개념이다. 이를 이용하면, 메서드를 하나의 식(expression)으로 표현하여 코드의 간결성을 높이고, 함수형 프로그래밍 패러다임을 구현할 수 있다.

name -> System.out.println(name) 람다 표현식에서 **name**은 입력 파라미터(매개변수)를 나타내며, 이는 forEach가 반복하면서 처리하는 컬렉션의 각 요소를 참조한다. -> 이후의 부분은 이 파라미터를 이용해 수행할 작업을 나타낸다.

즉, **names.forEach(name -> System.out.println(name));**는 names 컬렉션의 각 요소(여기서는 name)에 대해 **System.out.println(name);**를 실행하라는 의미이다.

이는 아래의 전통적인 for-each 루프와 같은 역할을 한다.

for(String name : names) {
    System.out.println(name);
}

위의 코드에서 **name**은 **names**의 각 요소를 참조하는 변수로 사용되는 것과 마찬가지로, 람다 표현식에서도 **name**는 각 요소를 참조하는 변수로 사용된다.

이후 버전에서의 컬렉션 업데이트

  1. Java 9에서는 불변 컬렉션이라는 개념이 도입되었다. 이는 컬렉션을 생성할 때 그 요소를 한 번만 설정하고, 그 이후로는 변경할 수 없는 컬렉션을 만들 수 있게 해준다. List.of(), Set.of(), Map.of() 등의 메서드가 추가되었다.
  2. 자바 16에서는 Stream.toList() 메서드가 추가되었다. 이 메서드는 스트림의 요소들을 새로운 리스트에 수집한다.
List<Integer> numbers = Stream.of(1, 2, 3, 4, 5).toList();