람다식을 이용한 함수형 프로그래밍2 : 메서드
표준 함수형 인터페이스 메서드
- java.util.function패키지의 인터페이스들은 모두 하나 이상의 default 또는 static 메서드를 포함하고 있는데 이들 메서드를 이용해서 동일한 계열의 여러 동작을 연결해서 사용할 수 있다.
andThen()와 compose()
andThen()와 compose() : Consumer, Function, Operator계열에 서언된 dafault메서드.
- 두 개의 함수형 인터페이스를 순차적으로 연결함.
- 첫번째 함수의 연산의 결과를 두번째 함수의 파라미터로 제공해서 최종 결과 값을 도출함.
- 최종 값의 타입은 두번째 함수의 리턴 타입임.
두 메서드의 차이점 : 적용순서.
- A 인터페이스에 선언되 andThen()을 사용해서 B인터페이스를 연결할 때 = A.andThen(B)
- A의 결과가 B의 파라미터로 활용되고 B의 리턴값이 AB리턴한 값과 동일함.
- A 인터페이스에 선언된 compose()를 사용해서 B인터페이스를 연결할 때 = A.compose(B)
- B의 리턴이 A의 파라미터로 사용되고 A의 리턴값은 AB리턴값과 동일함.
- A 인터페이스에 선언되 andThen()을 사용해서 B인터페이스를 연결할 때 = A.andThen(B)
Consumer 계열에서의 연결
- Consumer계열은 리턴값이 존재하지 않기때문에 최초의 파라미터가 그대로 두번째 인터페이스의 파라미터가 됨.
- 첫번째 인터페이스의 동작은 두번째 인터페이스의 동작에 영향을 주지 않음.
1 | DoubleConsumer con1 = num -> System.out.println(Math.pow(num, 2)); |
Function 계열의 연결
- Function계열 : andThen()과 compose()를 모두 사용가능.
- 순서차이 확인
1 | Function<String, String> func1 = name -> "Hi, "+name; |
Predicate계열의 연결
- 디폴트 메서드 : and(), or(), negate()
- and() : 두 개의 predicate를 연결하며 &&연산자와 동일하게 동작
- or() : 두 개의 predicate를 연결하며 ||연산자와 동일하게 동작
- negate() : 두 개의 predicate를 연결하며 !연산자(부정)와 동일하게 동작
- 클래스 메서드 : isEqual() : 대상 객체와 기준 객체를 비교.
- 위의 메서드들 서로 다른 두개의 predicate를 연결하거나 새로운 predicate반환한다.
메서드와 생성자 참조
- 더블콜론(::)연산자 : 단순히 기존에 사용된 코드를 재사용하는 경우 더블콜론연산자를 이용해 기존 메서드 참조가능.
1 | 클래스 :: 인스턴스_메서드 |
클래스 :: 인스턴스_메서드
- 람다식에 전달된 o1의 타입인 String 클래스가 가지는 compareTo()메서드에 두번째 파라미터인 o2가 전달된다.
1 | String[] langs = {"py", "js", "java", "db"}; |
클래스 :: 클래스_메서드
- f0 : 기본적인 람다식
- f1 : 최대한 축약한 람다식. 파라미터가 하나이므로 괄호()생략가능. 구현부가 return한 문장이므로 대괄호화 return키워드 생략가능
- f2 : 더클론론::연산자를 활용한 람다식
1 | Function<String, Integer> f0 = (str) -> {return Integer.parseInt(str);}; |
객체 :: 인스턴스_메서드
- 주어진 객체의 메서드가 호출되며 람다식에 전달된 파라미터는 메서드에 그대로 전달됨.
1 | String base ="람다"; |
클래스 :: new
- 생성자 참조함.
- 배열을 만들때 사용 가능 -> 이때, 파라미터 = 배열의 길이.
- 클래스 타입의 새로운 객체를 생성함.
- 호출되는 생성자는 전달되는 파라미터의 타입과 개수에 근거하여 결정됨.