首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写Java-8-函数接口

编写Java-8-函数接口
EN

Stack Overflow用户
提问于 2014-06-04 13:35:23
回答 1查看 2.2K关注 0票数 3

我有一个像这样的Java-8-FunctionalInterface:

代码语言:javascript
复制
@FunctionalInterface
public interface A {
    void doIt ();
}

Function-Interface提供了一个compose-Method。我想使用它来减少这样的A流:

代码语言:javascript
复制
Stream<A> as;
A composed = as.reduce (() -> {}, Function::compose);

因此,我希望有一个A函数,它调用流的每个A --它的方法doIt

代码语言:javascript
复制
composed.doIt (); // Executes every doIt ()

但是由于不是Function的实现者,所以方法引用Function::compose是不可能的。我不能从Function (或Supplier)扩展,因为这样我就有两个抽象方法(我自己的和Function的)。

我能做什么,使它成为可能,组成我的A功能

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-04 13:54:27

没有理由compose方法必须来自Function接口。对于您的情况,Function接口是不合适的,因为Function有一个返回值(而不是void),它的compose方法的目的是将一个函数的结果输入下一个函数。

只需创建您自己的compose方法:

代码语言:javascript
复制
@FunctionalInterface
public interface A {
  void doIt ();
  default A compose(A next) {
      return () -> { doIt(); next.doIt(); };
  }
}

然后你就可以按计划做:

代码语言:javascript
复制
Stream<A> as=…;
A composed = as.reduce (() -> {}, A::compose);

请注意,由于您的接口具有与Runnable相同的语义,您甚至可以使它成为Runnable的子接口,从而允许混合Runnables和As:

代码语言:javascript
复制
@FunctionalInterface
public interface A extends Runnable {
    default void doIt() { run(); }
    default A compose(Runnable next) {
      return () -> { doIt(); next.run(); };
  }
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24038947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档