2016-07-20 2 views
2

lambda의 사용을 쉽게 표준화하기 위해 일련의 일반 기능 인터페이스를 정의하는 작업을 누군가가 수행했는지 궁금합니다. 코어 라이브러리가 작업을 수행 한 C#에서 왔습니다.Java8에는 표준화 된 일반 기능 인터페이스가 있습니까?

"BiFunction"에 대해 읽었으며 서투른 것으로 나타났습니다. 등 TriFunction로 확장 할 때 특히

나는 다음과 같은 내놓았다 : 자바 8에서

public interface FI { 
@FunctionalInterface 
public interface Action<T> { 
    void invoke(T arg1); 
} 
@FunctionalInterface 
public interface Function0<TResult> { 
    TResult invoke(); 
} 
@FunctionalInterface 
public interface Function1<Targ1, TResult> { 
    TResult invoke(Targ1 arg1); 
} 
@FunctionalInterface 
public interface Function2<Targ1, Targ2, TResult> { 
    TResult invoke(Targ1 arg1, Targ2 arg2); 
} 
@FunctionalInterface 
public interface Function3<Targ1, Targ2, Targ3, TResult> { 
    TResult invoke(Targ1 arg1, Targ2 arg2, Targ3 arg3); 
} 
@FunctionalInterface 
public interface Function4<Targ1, Targ2, Targ3, Targ4, TResult> { 
    TResult invoke(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4); 
} 
@FunctionalInterface 
public interface Function5<Targ1, Targ2, Targ3, Targ4, Targ5, TResult> { 
    TResult invoke(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5); 
} 
@FunctionalInterface 
public interface Function6<Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, TResult> { 
    TResult invoke(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6); 
} 
@FunctionalInterface 
public interface Function7<Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, TResult> { 
    TResult invoke(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7); 
} 
@FunctionalInterface 
public interface Function8<Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8, TResult> { 
    TResult invoke(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7, Targ8 atg8); 
} 
@FunctionalInterface 
public interface Function9<Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8, Targ9, TResult> { 
    TResult invoke(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7, Targ8 atg8, Targ9 arg9); 
} 
@FunctionalInterface 
public interface Function10<Targ1, Targ2, Targ3, Targ4, Targ5, Targ6, Targ7, Targ8, Targ9, Targ10, TResult> { 
    TResult invoke(Targ1 arg1, Targ2 arg2, Targ3 arg3, Targ4 arg4, Targ5 arg5, Targ6 arg6, Targ7 arg7, Targ8 atg8, Targ9 arg9, Targ10 arg10); 
} 

} 
+2

표준 Java 라이브러리에는 정확히 이와 같은 것이 없습니다. 가장 가까운 것은'java.util.function' 패키지의 인터페이스입니다. – Jesper

+5

음 ... 당신의'Action'은 기본적으로'Consumer'입니다. 'Function0'은'Supplier'입니다. 'Function1'은'Function'입니다. 'Function2'는'BiFunction'입니다. 나머지는 아마 꽤 제한된 유용성이 있습니다. 10 개의 매개 변수로 함수를 작성한다면 아마도 더 좋은 방법을 쓸 것입니다. – khelwood

+0

10 개의 매개 변수가있는 함수는 해당 값을 래핑하는 클래스가 있어야합니다. –

답변

0

는 공식적으로 만 기능 4 가지 존재한다.

Consumer: Void function 
    Function: receive argument return argument 
    BiFunction: Receive 2 arguments return argument 
    Predicate: receive argument return boolean 

여기에 대한 몇 가지 예를 볼 수 있습니다. 당신이 찾을 수

https://github.com/politrons/reactive/blob/master/src/test/java/stream/Functions.java

+0

예, 그게 내가 발견 한 것입니다. –

+0

술어는 1 개의 인수를받습니다 – user1121883

+0

예, 실수, 업데이트, 고마워요! – paul

0

가장 가까운 유사은 java.util.function 패키지에 있습니다, 예를 들어, Google Guava 또는 다른 라이브러리를

interface Function<T,R> { R apply(T t) } 

interface Consumer<T> { void accept(T t) } 

interface BiFunction<T,U,R> { R apply(T t, U u) } 

등 당신은 자신을 정의 할 수 있습니다, 또는 당신이 몇 가지를 찾을 수 있습니다 .

2

javaslang [1]은 Function0 - Function8 그리고 심지어 CheckedFunction0 - CheckedFunction8을 제공합니다. 'memoization'및 'currying'과 같은 추가 기능까지 제공합니다.

http://javaslang.io