Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写Java-8-Functional-Interface_Java_Functional Programming_Java 8_Functional Interface - Fatal编程技术网

编写Java-8-Functional-Interface

编写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

我有一个Java-8-Functional界面,如下所示:

@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
和第
方法反过来应用它们。