Java에서 람다를 다루기 위한 노력

public interface FruieFilter {
	boolean isSelected(Fruit fruit)
}

private List<Fruit> filterFruits(List<Fruit> fruits, FruitFilter fruitFilter){
//for문 순회, 조건문 체크

}

-> 

filterFruits(fruits, new FruitFilter() {
	@Override
	public boolean isSelected(Fruit fruit) {
		return //....
	
	}	
}

->

private List<Fruit> filterFruits(List<Fruit> fruits, Predicate<Fruit> fruitFilter){
//for문 순회, 조건문 체크
//.... 
}

filterFruits(fruits, fruit -> fruit.getName().equals(""))

-> 

private List<Fruit> filterFruits(List<Fruit> fruits, Predicate<Fruit> fruitFilter){
	return fruits.stream() .....// stream 사용
}

filterFruits(fruits, Fruit::isApple); // 메소드 레퍼런스

코틀린에서의 람다

// predicate을 사용하지 않는다.
private fun filterFruits(fruits: List<Fruit>, filter: (Fruit) -> Boolean: List<Fruit> {
	val results = mutableListOf<Fruit>()
	for (fruit in fruits) {
		if (filter.invoke(fruit)) {
			results.add(fruit)
		}
	}
	return results
}

filterFruits(fruits) {it.name == "apple"} // 람다의 파라미터를 it으로 직접 참조

filterFruits(fruits) {fruit -> 
	println("apple come")
	fruit.name == "apple"
} 
// 마지막 파라미터가 함수인 경우, 소괄호 밖에 람다 사용 가능
// 람다를 여러줄 작성할 수 있고, 마지막 줄의 결과가 람다의 반환값임

Closure

Java

String FruitName = "banana";
FruitName = "apple"

filterFruits(fruits, (fruit) -> FriutName.equals(fruit.getName())); // 에러 발생

Kotlin

var fruitName = "banana"
fruitName = "apple"
filterFruits(fruits) { it.name = fruitName }

다시 try with resources