함수형 프로그래밍 ?
Collections.sort(cryptoCurrencies, new Comparator<CryptoCurrency>() {
@Override
public int compare(CryptoCurrency o1, CryptoCurrency o2) {
return o1.getUnit().name().compareTo(o2.getUnit().name());
}
});
-> 함수형 인터페이스인 Comperator를 사용..
Comperator 인터페이스는 default 메서드가 여러개 있지만 추상 메서드 하나만 정의되어 있으므로 함수형 인터페이스이다.
@FunctionalInterface 어노테이션으로 명시적으로 지정되어있다.
그런데, 인터페이스 자체를 익명 구현객체로 전달하는 방식이 코드자체가 너무 길어서 지저분하게 보인다.
-> 람다 표현식을 사용한다.
Collections.sort(cryptoCurrencies, (o1, o2) -> o1.getUnit().name().compareTo(o2.getUnit().name()));
헷갈리면 안될 것!
함수형 인터페이스의 추상 메서드를 람다 표현식으로 작성해서 메서드의 파라미터로 전달한다.
이 말의 의미는 "메서드 자체를 파라미터로 전달하는 것" 이 아니다. 바로, 함수형 인터페이스를 구현한 클래스의 인스턴스를 람다 표현식으로 작성해서 전달하는 것람다 표현식은 함수형 인터페이스를 구현한 클래스의 객체이다!
람다표현식은 외부에서 정의된 변수도 사용할 수 있다. as 람다 캡처링
람다표현식 보다 좀 더 간결하게 함수형 인터페이스를 작성할 수 있다.
메서드의 이름만 사용하여 메서드 레퍼런스를 표현합니다.
(Car car) -> car.getCarName() = Car::getCarName
함수 디스크립터란 일반화된 람다 표현식을 통해서 이 함수형 인터페이스가 어떤 파라미터를 가지고, 어떤 값을 리턴하는지 설명해주는 역할을 한다.
Predicate : 서술하다, 단정하다. 파라미터가 조건을 만족하는지 검사한다는 의미이다.
Consumer : 리턴값이 없고 데이터를 소비한다라는 의미
Function<T,R> : 함수 내에서 어떤 처리 과정을 거친 후에 그 결과로 특정 타입의 값을 반환한다.
Supplier : 어떤 값이 필요할 때 데이터를 제공하는 용도로 사용한다. 즉, 어떤 데이터를 제공할지에 대한 동작을 정의한다.