lambda
- 람다는 관심을 받지 못하다가 최근 들어 함수적 프로그래밍이 병렬 처리와 이벤트 지향 프로그래밍에 적합하여 사용되고 있다.
- 람다식은 익명 함수를 생성하기 위한 식으로 객체 지향 언어보다는 함수지향 언어에 가깝다.
- 람다식을 사용할 경우 자바 코드가 매우 간결해지고, 컬랙션의 요소를 필터링하거나 매핑해서 원하는 결과를 쉽게 집계할 수 있다.
함수적 인터페이스(@FunctionalInterface)
1
2
3
4
@FunctionalInterface
public interface MyFunction {
public void method();
}
위와 같이 구현하여 사용할 수 있다. @FunctionalInterface 어노테이션을 붙일경우 메서드를 2개 이상 만들수 없다. 컴파일 전단계에서 오류가 발생한다.
1
2
3
4
5
6
7
8
9
10
public class Main {
public static void main(String[] args) {
MyFunction myFunction = () -> {
System.out.println("hello");
};
myFunction.method();
}
}
위와 같이 람다식으로 구현하여 사용한다.
표준 API 의 함수적 인터페이스
- 아래 링크에서 사용방법을 자세히 다룬다. 표준 API 의 함수적 인터페이스 활용
andThen() compose()
두 개의 함수적 인터페이스를 순차적으로 연결하고, 첫 번째 처리 결과를 두 번째 매개값으로 제공해서 최종 결과값을 얻을 때 사용한다.
- andThen() :
ab = a.andThen(b);
- a를 실행이후 결과값을 b의 인자로 사용하여 최종 결과를 출력
- Consumer , Function , Operator 만 지원
- compose() :
ab = a.compose(b);
- b를 실행이후 결과값을 a의 인자로 사용하여 최종 결과를 출력
- Function , Operator 만 지원
and(), or(), negate(), isEqual()
리턴 값이 boolean인 Predicate의 디폴트 메서드이다.
- and() :
- 두 메서드가 true 일때 true
- or() :
- 두 메서드중 하나만 true 여도 true
- negate() :
- 결과 값이 반대인 predicate를 생성한다.
- isEqual() :
- 두 메서드의 결과 같을경우 true
::
- 단순히 메서드를 매개값으로 전달하는 역할만 하는경우 사용할 수 있다.
매개 변수의 메서드 참조
- class Address에 getCountry 매서드가 있을때 다음과 같이 사용할 수 있다.
1
2
3
Function<Address, String> function = Address::getCountry;
String result = function.apply(new Address("서울", "한국"));
System.out.println(result);
생성자 참조
- 생성자를 참조하여 사용할 수 있다.
1 2
BiFunction<String,String,Address> function = Address::new;//인자가 2개이기 때문에 BiFunction Address address = function.apply("서울", "한국");