2016-07-20 83 views
2

我想知道是否有人做了定義一組泛型函數接口的工作來簡化和標準化lambda表達式的使用。 我來自C#,核心庫完成了這項工作。Java8中是否有標準化的泛型功能接口?

我讀到「BiFunction」,發現它很笨拙。尤其是當擴展到三官能等

我想出了以下內容:

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

那麼......你的「動作」基本上是「消費者」。 'Function0'是'Supplier'。 'Function1'是'Function'。 'Function2'是'BiFunction'。其餘的可能是相當有限的用處。如果你用10個參數編寫函數,可能有更好的方法來編寫它。 – khelwood

+0

帶有10個參數的函數可能應該有一個類來包裝這些值。 –

回答

0

在Java 8日正式僅存在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

Predicate收到1個參數 – user1121883

+0

是的錯誤,更新,謝謝! – paul

0

你會發現最近的類似物在java.util.function包:

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) } 

等,您可以定義自己,或者你可能在找一些,例如,Google Guava或其他圖書館。

2

javaslang [1]提供了Function0- Function8並且甚至CheckedFunction0-CheckedFunction8。它們甚至提供了諸如「memoization」和「currying」等附加功能。

http://javaslang.io