Stream API는 컬렉션이나 배열과 같은 다양한 데이터 소스를 연속된 요소(스트림)로 변환하여, 간결하고 효율적으로 데이터를 처리할 수 있도록 돕는 기능
Stream?
"데이터가 연속적으로 흘러가는 흐름"을 포괄적으로 가리키며, 적용 분야에 따라 의미가 조금씩 달라진다. Java Stream API는 컬렉션의 요소를 마치 한 줄로 이어진 흐름처럼 다루면서, 중간 연산(filter, map)과 최종 연산(forEach, collect)을 통해 선언적으로 처리할 수 있도록 설계되었다. 이처럼 여러 영역에서 비슷하지만 조금씩 다른 맥락으로 사용되므로, “stream”이라는 단어가 가리키는 대상이 무엇인지 사전에 명확히 구분해야 커뮤니케이션 미스를 줄일 수 있다.
filter(), map(), sorted(), distinct() 등.forEach(), collect(), reduce() 등. // 스트림 파이프라인의 예시
scores.entrySet().stream()
.filter(highScore) // 중간 연산
.forEach(entry ->
System.out.println("High scorer: " + entry.getKey() + " => " + entry.getValue())); // 최종 연산
List나 long과 같은 실제 값 또는 컬렉션으로 도출된다익명 클래스와 람다 표현식으로 기본 연산을 이용할 수 있다. 익명 클래스와 람다는 모두 함수형 인터페이스(Predicate, Function, Consumer 등)를 구현하는 방법이지만, 람다 표현식을 사용하면 코드를 훨씬 간결하게 작성할 수 있다.
test(T t) 메서드를 구현하며, true면 요소를 유지, false면 제거한다.apply(T t) 메서드를 통해 입력값을 가공하여 반환한다.accept(T t) 메서드를 통해 요소를 소비(처리)한다.