이 글은 예전에 작성된 글이다.
람다식과 스트림에 대한 자세한 내용은 새롭게 포스팅하였다.
- 람다식 ??
람다식, 또는 람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수(匿名函數, Anonymous functions)를 지칭하는 용어이다.
JAVA에서 람다식은 8 버전부터 지원한다.
뭔가 말이 어렵다.
코드로 간단히 이해해 보자.
아래는 일반적인 더하기 메소드다.
int plus(int x, int y){
return x+ y;
}
위 메소드를 람다식으로 바꾸면
아래와 같다.
(int x, int y) -> x + y
기본적으로 이런 식이라는 것을 염두에 두고
stream 인터페이스 내
4개의 메소드를 살펴보자.
1. map()
map 메소드는 입력 컬렉션을 출력 컬렉션으로 매핑하거나 변경할 때 유용하다.
예제 코드
list의 엘리먼트 값을 모두 대문자로 변경하여 출력.
List<String> names = Arrays.asList("Sehoon", "Songwoo", "Chan", "Youngsuk", "Dajung");
//java 8 Lambda
names.stream()
.map(name -> name.toUpperCase())
.forEach(name -> System.out.println(name));
위 코드를 출력하면 아래와 같다.
SEHOON
SONGWOO
CHAN
YOUNGSUK
DAJUNG
2. filter()
filter 메소드는 컬렉션을 조건에 의한 선택을 할때 유용하다.
filter 메소드는 boolean 결과를 리턴하는 람다 표현식이 필요하다.
예제의 collection 메소드는 filter 표현식에 나온 값을 list로 변경한다.
예제 코드
'S'로 시작하는 이름을 출력.
Listt<String> names = Arrays.asList("Sehoon", "Songwoo", "Chan", "Youngsuk", "Dajung");
//java 8 Lambda
final List<string> startsWithS = names.stream()
.filter(name -> name.startsWith("S"))
.collect(Collectors.toList());
System.out.println(startsWithS);
위 코드를 출력하면 아래와 같다.
[Sehoon, Songwoo]
3. reduce()
reduce 메소드는 엘리먼트를 비교하고 컬렉션에서 하나의 값으로 연산한다.
예제 소스를 보면 첫 번째로 리스트에 있는 처음 두 개 엘리먼트를 사용한다.
그리고 람다 표현식의 결과는 다음 호출에 사용된다.
두 번째 호출에서는 name1은 이전 호출의 결과이며 name2는 컬렉션의 세 번째 엘리먼트이다.
예제 코드
특정 스트링 값의 길이보다 크고, 리스트의 가장 긴 이름을 가진 엘리먼트를 출력.
List<String> names = Arrays.asList("Sehoon", "Songwoo", "Chan", "Youngsuk", "Dajung");
//java 8 Lambda
String LongerEliment = names.stream()
.reduce("ked", (name1, name2) ->
name1.length() >= name2.length() ? name1 : name2);
System.out.println("java 8 "+LongerEliment);
위 코드를 출력하면 아래와 같다.
java 8 Youngsuk
기본적으로 reduce 메소드는 Optional형을 반환한다.
그렇기 때문에 첫 번째 인자값에 "ked"와 같은 문자열을 넣어주면
Optional을 벗겨주기도 하고, list의 데이터가 없는 경우 "ked"를 초기값으로 설정해준다.
거기에 초기값인 "ked"보다 긴 문자열이 없다면 "ked"를 반환한다.
다른 글에도 설명해두었다.
4. collect()
collect 메소드는 reduce() 메소드와 동일하게 값을 하나로 모으는 다른 형태인데, collect는 여러 convenience method를 제공한다.
아래 예제는 리스트의 엘리먼트를 콤마로 구분하여 출력하는데, 기존 for문으로는 마지막 엘리먼트에 콤마를 안 붙이는 게 여간 귀찮다.
하지만 collect 메소드를 사용하면 간단하게 만들 수 있다.
예제 코드
리스트의 엘리먼트를 콤마로 구분하여 출력. 단 마지막 엘리먼트에 콤마가 없어야 한다.
List<String> names = Arrays.asList("Sehoon", "Songwoo", "Chan", "Youngsuk", "Dajung");
//java 8 Lambda
System.out.println(names.stream()
.map(String::toUpperCase)
.collect(Collectors.joining(", ")));
위 코드를 출력하면 아래와 같다.
SEHOON, SONGWOO, CHAN, YOUNGSUK, DAJUNG
코드상에서 String::toUpperCase 는 메소드참조를 표현한 것이다.
다른 글에 관련하여 포스팅해두었다.
**참조
https://kim-jong-hyun.tistory.com/53
https://inma.tistory.com/150
'개발자의 삶 > Java' 카테고리의 다른 글
[Java] 메소드 참조(Method References)에 대하여 ( 이중콜론 :: ) (0) | 2023.06.05 |
---|---|
[Java] 람다식(Lambda Expression)과 스트림(Stream)에 대하여 - (2) (1) | 2023.06.01 |
[Java] 람다식(Lambda Expression)과 스트림(Stream)에 대하여 - (1) (0) | 2023.05.31 |
[Java] 오토박싱(Autoboxing), 언박싱(unboxing) (1) | 2023.05.27 |
[Java] 원시 타입(Primitive type), 참조 타입(Reference type), 래퍼클래스(Wrapper Class) (0) | 2023.05.26 |