○ Function으로 순차적 연결하기
Function 함수적 인터페이스는, 기본적으로 개념을 다시 한번 짚어보고 넘어가야 합니다. 아래 아티클을 통해서 기본적인 동작 방식을 상기하고 오시기 바랍니다.
다시 복습해 보자면, Function 함수적 인터페이스는 (기본형일 경우) 추상 메서드 apply(T t)를 구현하게 됩니다. 이 인터페이스의 목적은 Function<T, R>일 경우 T를 파라미터 인자 값으로 받아 R 타입으로 변환해 리턴하는 것이죠. 결국 추상 메서드 apply(T t)의 리턴 타입 역시 R이 되겠죠? 이 기본 개념을 다시 기억해 주시기 바랍니다.
이제 예제를 살펴보겠습니다. Function<Member, Address>가 있는데 이를 Function<Address, String>과 순차적으로 연결하여 궁극적으로는 Function<Member, String>을 생성한다고 가정해 보겠습니다.
Function<Member, Address>와 Function<Address, String>을 andThen( ) 또는 compose( )를 이용해서 연결해 보면, Function<Member, Addres>에서 리턴된 Address를 Function<Address, String>에 전달하여 String을 리턴하게 되는 - 결과적으로 Function<Member, String>과 같은 동작을 하게 됩니다.
public class Address {
private String country;
private String city;
public Address(String country, String city) {
this.country = country;
this.city = city;
}
public String getCountry() { return country; }
public String getCity() { return city; }
}
public class Member {
private String name;
private String id;
private Address address;
public Member(String name, String id, Address address) {
this.name = name;
this.id = id;
this.address = address;
}
public String getName() { return name; }
public String getId() { return id; }
public Address getAddress() { return address; }
}
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.function.Consumer;
import java.util.function.Function;
public class ExampleMain {
public static void main(String[] args) {
Function<Member, Address> functionA;
Function<Address, String> functionB;
Function<Member, String> functionAB;
String city;
functionA = (m) -> { return m.getAddress(); };
functionB = (a) -> { return a.getCity(); };
functionAB = functionA.andThen(functionB);
city = functionAB.apply( new Member("스윙스", "Moon", new Address("KR", "SEOUL")) );
System.out.println("거주지 : " + city);
functionAB = functionB.compose(functionA);
city = functionAB.apply( new Member("블랙넛", "GODAEWNG", new Address("KR", "JEONJU")) );
System.out.println("거주지 : " + city);
}
}
/* 출력
거주지 : SEOUL
거주지 : JEONJU
*/