2016-07-20 4 views
2

Интересно, когда и где кто-то делал задачу определения набора общих функциональных интерфейсов для облегчения и стандартизации использования лямбда. Я пришел из C#, где основные библиотеки выполнили эту работу.Существуют ли стандартизованные функциональные интерфейсы в Java8?

Я прочитал о «BiFunction» и нашел его неуклюжим. Особенно когда они распространяются на TriFunction и т.д.

я придумал следующее:

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' является' поставщиком'. 'Function1' является' Function'. 'Function2' -' BiFunction'. Остальные, вероятно, имеют довольно ограниченную полезность. Если вы пишете функции с 10 параметрами, есть, вероятно, лучшие способы их написания. – khelwood

+0

Функция с 10 параметрами, вероятно, должна иметь класс для переноса этих значений. –

ответ

0

В Java-Официально существует только 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 пакете:

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

 Смежные вопросы

  • Нет связанных вопросов^_^