Kotlin의 람다 다루기
Java에서 람다를 다루기 위한 노력
익명 클래스와 인터페이스 활용
예제 클래스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Fruit {
private final String name;
private final int price;
public Fruit(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
public boolean isApple() {
return this.name.equals("사과");
}
}
인터페이스
1
2
3
4
5
public interface FruitFilter {
boolean isSelected(Fruit fruit);
}
구현체
1
2
3
4
5
6
7
public class FruitFilterImpl implements FruitFilter {
@Override
public boolean isSelected(Fruit fruit) {
return Arrays.asList("사과", "바나나").contains(fruit.getName()) && fruit.getPrice() > 5_000;
}
}
메서드
1
2
3
4
5
6
7
8
9
private List<Fruit> filterFruits(List<Fruit> fruits, Predicate<Fruit> fruitFilter) {
List<Fruit> results = new ArrayList<>();
for (Fruit fruit : fruits) {
if (fruitFilter.test(fruit)) {
results.add(fruit);
}
}
return results;
}
- 인터페이스로 과일을 받고
boolean
으로 반환한 후, 메소드에서 필터를 받아서 필터의 결과를 반환하는 방식으로 코딩 가능
JDK8부터는 인터페이스를 활용한 익명클래를 효율적으로 사용 가능
람다(이름없는 함수) 문법
1
filterFruits(fruits, fruit -> fruit.getName().equals("사과"));
변수 -> 변수
를 이용한 함수(변수1, 변수2) -> 변수1과 변수2
를 이용한 함수
반복문을 깔끔하게 처리하기 위해 스트림 사용 가능 (병렬 처리에 강점을 가짐)
1
2
3
4
5
private List<Fruit> filterFruits(List<Fruit> fruits, Predicate<Fruit> fruitFilter) {
return fruits.stream()
.filter(fruitFilter)
.collect(Collectors.toList());
}
메소드 레퍼런스
1
filterFruits(fruits, Fruit::isApple);
메소드 자체를 직접 넘겨주는 것 처럼 사용할 수 있었다.
- 실제로 받는 것은 인터페이스 미리 만들어 두었던
Predicate
인터페이스
Java에서 함수는 변수에 할당되거나 파라미터로 전달될 수 없다.
Kotlin에서의 람다
Kotlin의 Closure
다시 try with resources
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.