编写Java-8-Functional-Interface
我有一个Java-8-Functional界面,如下所示:编写Java-8-Functional-Interface,java,functional-programming,java-8,functional-interface,Java,Functional Programming,Java 8,Functional Interface,我有一个Java-8-Functional界面,如下所示: @FunctionalInterface public interface A { void doIt (); } Stream<A> as; A composed = as.reduce (() -> {}, Function::compose); 函数-接口提供了一种组合-方法。我想用它来减少A流,如下所示: @FunctionalInterface public interface A { v
@FunctionalInterface
public interface A {
void doIt ();
}
Stream<A> as;
A composed = as.reduce (() -> {}, Function::compose);
函数
-接口提供了一种组合
-方法。我想用它来减少A
流,如下所示:
@FunctionalInterface
public interface A {
void doIt ();
}
Stream<A> as;
A composed = as.reduce (() -> {}, Function::compose);
但是,由于不是函数的实现者,因此那里不可能使用方法引用函数::compose
。我不能从函数
(或供应商
)扩展,因为这样我就有两个抽象方法(我自己的和函数
)中的一个)
我能做些什么来组合我的A
函数?没有理由让组合方法必须来自函数
接口。对于您的情况,函数
接口不合适,因为函数
有返回值(而不是无效
),它的组合
方法旨在将一个函数的结果输入下一个函数
只需创建您自己的组合方法:
@FunctionalInterface
public interface A {
void doIt ();
default A compose(A next) {
return () -> { doIt(); next.doIt(); };
}
}
然后,您可以按计划执行以下操作:
Stream<A> as=…;
A composed = as.reduce (() -> {}, A::compose);
do
在Java中不是有效的标识符您的问题有点不清楚-您只是想as.forEach(a::do)
?@fabian:我纠正了这一点,我将代码减少了两倍;-)但这不是问题所在。我想要一个A的对象。稍后我想用A.doIt()来调用它。它的执行应该导致调用流中所有a的每个doIt。好的,我没有想到这一点。但是我希望Java能够看到A是一个功能接口,并且在需要时,将其视为函数的实现,因此我不需要重复compose的实现。@F.Böller:但是您的接口不是一个函数。函数
有一个T->R
签名,而您的界面有一个()->()
签名。这基本上是正确的,因为Java是静态类型的,它的函数接口是静态类型的,因此执行函数组合的操作符也必须是静态类型的。一个小点:在函数中使用的约定是f.compose(g)
类似于f(g()),它在f
之前应用g
。和第
方法反过来应用它们。