포스트

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 라이센스를 따릅니다.