자바에서의 람다식은 다음과 같은 문법으로 사용할 수 있다.
(파라미터 목록) -> { 람다식 바디 }
람다식의 시작 부분에는 파라미터들을 명시할 수 있다. 비교적 엄격한 타입 제한을 두고 있는 자바지만 람다의 파라미터를 추론할 수 있는 경우에는 타입을 생략할 수도 있다. 위에서 봤던 '(a, b) -> a + b' 람다식에서도 파라미터인 a, b 의 타입이 명시되지 않았다. 추론가능한 타입을 생략하면서 간결함을 얻었다. (추론할 수 없는 경우에는 메소드 파라미터처럼 타입도 명시해줘야한다.)
파라미터가 하나인 경우 괄호를 생략 할 수도 있다. 제곱을 구하는 람다식을 다음과 같이 작성할 수 있다.
a -> a * a
하나의 파라미터만 필요하기 때문에 괄호를 생략했다.
람다식의 바디가 하나의 표현식인 경우에는 중괄호를 생략할 수 있다. 위에서 봤던 람다들은 하나의 식으로 구성되어 있기 때문에 중괄호를 생략했다. 이 때, 세미콜론은 붙이지 않는다.
다만, 라다식의 바디에 'return' 문이 있을 경우 중괄호를 생략할 수 없다.
(a, b) -> { return a > b ? a : b }
중개 연산은 연산 결과를 Stream 형태로 반환하기 때문에 연속적으로 연결해서 사용할 수 있다.
데이터소스객체집합.Stream생성().중개연산().최종연산();
String[] intArray = { "hello world", "yellow", "green", "hello", "red", "blue" };
Set<String> set = Arrays.asList(intArray) // intArray를 List로 변형하고
.stream() // 1. stream 생성
.filter(e -> e.startsWith("hello")) // 2. 중개 연산 - hello로 시작하는 단어
.collect(Collectors.toSet()); // 3. 최종 연산 - 중개 연산을 통해 가공된 stream을 모아줌
set.forEach(e -> System.out.println(e));
// map(), flatMap()
Stream<String> stream = Stream.of("HTML", "CSS", "JAVA", "JAVASCRIPT");
stream.map(s -> s.toLowerCase()).forEach(System.out::println); //해당 스트림의 요소들을 주어진 함수에 인수로 전달하여,
//그 반환값들로 이루어진 새로운 스트림을 반환
/*
* html
* css
* java
* javascript
*/
// forEach()
Stream<String> stream = Stream.of("넷", "둘", "셋", "하나");
stream.forEach(System.out::println); // 각 요소를 출력
/*
* 넷
* 둘
* 셋
* 하나
*/
// collect()
Stream<String> stream = Stream.of("넷", "둘", "하나", "셋");
List<String> list = stream.collect(Collectors.toList()); // 스트림을 리스트로 변환
Iterator<String> iter = list.iterator();
while(iter.hasNext()) {
System.out.print(iter.next() + " "); // 넷 둘 하나 셋
}
참고
Java - Lambda Expression(람다식)이란?
[Java] 자바8의 람다식(lambda expression)
[Java] Java 8 Stream이란?