take(10, print(number)) |
정리해보자면 아래와 같다.
단순한 람다 구문의 경우, 람다 구분에 중괄호가 없을 수도 있다.
return 이 없을 수도 있다.
매개변수에는 타입을 명시하지 않아도 된다. (타입 추론)
람다식 문법을 컴파일러가 익명 클래스로 변환한다. 즉, 함수형 인터페이스를 컴파일러가 구현하도록 위임하는 형태라 볼 수 있다
/** *해당 인터페이스가 함수형인터페이스라는것을 알려주고 *한개 초과의 메서드를 작성할 시 컴파일러 에러를 낸다. */ @FunctionalInterface public interface Movable { void move(String str); } |
또한, 함수형 프로그래밍에서 함수는 인풋에 의해서만 아웃풋이 달라져야하며 그것을 지원하기위해 람다 표현식으로 구현할때 객체는 상태를 가질 수 없다. 따라서 인스턴스 필드가 들어갈 수 없다.
public class Fruit { private String name; private String color; Fruit(String name, String color){ this.name = name; this.color = color; } String getName(){ return this.name; } String getColor(){ return this.color; } } |
List<Fruit> extractApple(List<Fruit> fruits){ List<Fruit> resultList = new ArrayList<>(); for(Fruit fruit : fruits){ if("apple".equals(fruit.getName())){ resultList.add(fruit); } } return resultList; } List<Fruit> extractRed(List<Fruit> fruits){ List<Fruit> resultList = new ArrayList<>(); for(Fruit fruit : fruits){ if("red".equals(fruit.getColor())){ resultList.add(fruit); } } return resultList; } |
static List<Fruit> extractFruitList(List<Fruit> fruits, Predicate<Fruit> predicate){ List<Fruit> resultList = new ArrayList<>(); for(Fruit fruit : fruits){ if(predicate.test(fruit)){ resultList.add(fruit); } }
return resultList; } |
List<Fruit> fruits = Arrays.asList(new Fruit("apple", "red"), new Fruit("melon", "green"), new Fruit("banana", "yellow")); List<Fruit> appleList = extractFruitList(fruits, new Predicate<Fruit>() { @Override public boolean test(Fruit fruit) { return "apple".equals(fruit.getName()); } }); List<Fruit> redList = extractFruitList(fruits, new Predicate<Fruit>() { @Override public boolean test(Fruit fruit) { return "red".equals(fruit.getColor()); } }); |
List<Fruit> appleList = extractFruitList(fruits, fruit-> "apple".equals(fruit.getName())); List<Fruit> redList = extractFruitList(fruits, fruit-> "red".equals(fruit.getColor())); |
'개발공부 > JAVA8' 카테고리의 다른 글
JAVA 8 files.Find 함수 - 하위 파일 디렉토리 가져오기 (0) | 2018.06.28 |
---|