BiFunction과 TriFunction


Java 8BiFunction 이라는 것이 추가되었습니다.



private BiFunction<Integer, String, String> createStatusErrorMessage = (code, status) -> {
StringBuilder sb = new StringBuilder();

//do something.

return sb.toString();
};



기본적인 생김새는 위와 같습니다.

앞의 두개의 타입으로 파라미터를 받고 3번째 타입으로 return 하겠다는 의미입니다.

TriFunction도 있을 거라고 생각을 했는데 없어서 따로 만들어야 합니다.



@FunctionalInterface
public interface TriFunction<A, B, C, R> {

R apply(A a, B b, C c);

default <V> TriFunction<A, B, C, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (A a, B b, C c) -> after.apply(apply(a, b, c));
}
}



위와 같이 FunctionalInterface annotation을 넣은 TriFunction interface를 만듭니다.

생김새는 BiFunction과 거의 같습니다.



private TriFunction<String, String, String, String> createStatusErrorMessage = (paymentStatus, pgStatus, pgType) -> {
StringBuilder statusErrorBuilder = new StringBuilder();

//do something.

return statusErrorBuilder.toString();
};



BiFunction과 TriFunction의 사용방법도 같습니다.

예를 들어 Parameter를 분류하여 ErrorMessage 를 생성하는 용도로 사용한다고 하겠습니다.



private static Map<String, TriFunction<String, String, String, String>> errorBuilderMap = new HashMap<>();

public ErrorMessageBuilder() {
errorBuilderMap.put("STATUS", createStatusErrorMessage);
}


public String build() {
return errorBuilderMap.get(errorMessageBuilder.errorType)
.apply(errorMessageBuilder.data1, errorMessageBuilder.data2, errorMessageBuilder.data3);
}



위와 같이 Map<String, TriFunction> 에 Key로 사용할 에러 메세지 타이틀과 에러 메세지를 만들 TriFunction을 넣습니다.

그리고 파라미터를 입력받아 TriFunction을 get하여 TriFunction.apply(parameter1, parameter2, parameter3) 하면 해당 TriFunction이 호출되어 실행되고 값을 리턴합니다. 





+ Recent posts