람다식
- 함수형 인터페이스를 사용할 때 람다식을 사용하면 코드가 간결해진다.
- 람다식은 하나의 익명 객체로, 인터페이스 참조 변수에 담아줘야 한다.
- 함수형 인터페이스는 추상 메소드가 단 하나 존재하므로, 람다식을 사용하면 명시하지 않아도 해당 메소드를 의미하게 된다.
public class Main {
public static void main(String[] args) {
MyRunnable object2 = () -> System.out.println("Let's run");
object2.run();
}
}
람다 사용법
기본: (int num) -> { System.out.println(num); }
단일 실행문은 중괄호 제거: (int num) -> System.out.println(num);
단일 인자는 타입 생략: (num) -> System.out.println(num);
단일 인자는 소괄호 제거: num -> System.out.println(num);
인자가 없으면 소괄호 필수: () -> System.out.println("매개변수 없음");
인자가 여러개면 소괄호 필수: (x, y) -> System.out.println(x, y);
인자가 없고 반환값이 있으면: () -> { return value; };
실행코드가 return문 뿐이면 return 생략 가능: () -> value;
매개변수, 리턴타입 둘다 있으면: (x, y) -> x+y;
사용 예제
@FunctionalInterface
interface Comparator<T> {
int compare(T o1, T o2);
}
// 익명 객체
List<String> list = Arrays.asList("abc","aaa","bbb");
Collections.sort(list, new Comparator<String>() {
public int compare(String s1, String s2) {
return s2.compareTo(s1);
}
})
// 람다식 사용
Collections.sort(list, (s1,s2) -> s2.compareTo(s1));
더블 콜론 (::)
- 람다식과 동일한 처리 방법을 갖는 표현으로, 메소드 참조 연산자라고 부른다.
- 메소드 참조는 람다식에서 파라미터의 중복을 피하기 위해 사용한다.
< 인스턴스의 메소드를 참조하는 경우 >
public class Main {
public static void main(String[] args) {
List<Member> memberList = Arrays.asList(new Member("A"),new Member("B"),new Member("C"));
// 일반 람다식
String collect = memberList.stream().map(element -> element.getName()).collect(Collectors.joining());
// 메소드 참조 표현식
String collect = memberList.steam().map(Member::getName).collect(Collectors.joining());
}
public static class Member {
private String name;
public Member(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
}
< 인스턴스를 생성하는 경우 >
public class Main {
public static void main(String[] args) {
List<Member> memberNameList = List.of("A","B","C")
// 일반 람다식
List<Member> memberList = memberNameList.stream().map(name -> new member(name)).collect(Collectors.toList());
// 메소드 참조 표현식
List<Member> memberList = memberNameList.stream().map(Member::new).collect(Collectors.toList());
}
public static class Member {
private String name;
public Member(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
}
'Java > 개념' 카테고리의 다른 글
힙 / 이진 탐색 트리 (0) | 2023.12.15 |
---|---|
정규표현식 (1) | 2023.11.02 |
익명 클래스 (0) | 2023.10.29 |
equals, hashCode (0) | 2023.10.27 |
String / int 변환 (0) | 2023.10.23 |