문법의 뜻: 클래스 안에 있는 메서드
- 메서드를 매개변수로 넘겨줄 수 있다
// 기본적으로 문법은 다음과 같다
(파라미터 값, ...) -> { 함수 몸체 }
// 아래의 함수 두개는 같은 함수
// 이름 반환타입, return문 여부에 따라 {}까지도 생략이 가능
public int toLambdaMethod(int x, int y) {
return x + y;
}
(x, y) -> x + y
// 이런 함수도 가능
public int toLambdaMethod2() {
return 100;
}
() -> 100
// 모든 유형의 함수에 가능
public void toLambdaMethod3() {
System.out.println("Hello World");
}
() -> System.out.println("Hello World")
한 번 더 추상화된 자료구조와 자주 사용하는 프로그래밍 API를 제공한 것
- 자료구조를 한 번 더 추상화했기 때문에, 자료구조의 종류에 상관없이 같은 방식으로 다룰 수 있다
( + 병렬 처리에 유리한 구조로 조건부로 성능도 챙길 수 있다)- 조금 더 쉽게 “비유” 하자면, 자료구조의 “흐름”을 객체로 제공해 주고, 그 흐름 동안 사용할 수 있는 메서드들을 api로 제공해 주고 있는 것
- 쉽게 말해서 자료구조의 흐름이다
원본의 데이터를 변경하지 않는다
일회용이다
- 한 번 사용한 스트림은 어디에도 남지 않는다

위에 있는 것은 실제 java.collection 내부의 stream() 메서드다
collection에 정의되어 있기 때문에
컬렉션을 상속하는 모든 구현체들은 스트림을 반환할 수 있다
carsWantToPark.stream()
.filter((Car car) -> car.getCompany().equals("Benz"))
.toList();
스트림 api는 너무 방대해서 한 번에 다 소개할 수도, 배울 수도 없다
코드를 마주할 때마다, 혹은 사용해 보면서 어떤 것들이 있는지 알아보는 것이 중요하다
List<String> carNames = Arrays.asList("Series 6", "A9", "Ionic 6");
carNames.stream()
.forEach(System.out::println);
// 결과
// Series 6
// A9
// Ionic 6
carNames.stream()
.map(name -> name.toUpperCase()).toList();
// 결과
// ["SERIES 6", "A9", "IONIC 6"]
조건에 맞는 것만 반환
모든 요소를 가공해서 반환