首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果Java程序员想在Java 8之前传递一个函数,他们会做些什么呢?

如果Java程序员想在Java 8之前传递一个函数,他们会做些什么呢?
EN

Stack Overflow用户
提问于 2016-07-16 23:58:26
回答 2查看 1K关注 0票数 6

请对我温柔点。

我听说Java 8引入了lambdas。但是在那之前,如果你想传递一个函数,比如说,作为一个论点,你做了什么?

我可以想到的一种方法是创建这样一个方法接口:

代码语言:javascript
运行
复制
public interface ISingleMethodInterface
{
  bool Really(int n);
}

public bool GimmeFunction(ISingleMethodInterface interface, int n)
{
  return interface.Really(n);
}

但是,作为一流公民的职能的应用非常有限,因为:

  1. 除了执行该函数或将该对象传递给另一个方法之外,您不能做更多的事情。有了兰巴达,你就可以作曲了。例如,你可以像这样否定那个羔羊: 公共bool GimmeLambdaAndIWillComputeItsInverse(Func谓词,int n) {返回!谓词(N);}
  2. 你不能返回兰巴斯或他们的衍生物。我的意思是,你只能像这样返回同一个对象: //我知道Java没有元组,但让我们忘记,目前公共元组GimmeFunction(ISingleMethodInterface接口,int n) {返回新元组{ Item1 =接口,Item2 =n };} 使用lambdas,您可以返回类似这样的衍生品: 公共Func GetInverseFunction(Func谓词,int n) {返回n =>!谓词(N);}

所以,如果你需要做这样的事情,你做了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-17 07:01:59

一个简单地传递了函数接口的实例。您对此相对于lambdas的贬低是有点不恰当的,因为在Java中,lambda实际上是功能接口。因此,由于一种是以另一种方式实现的,它们既不强于另一种。不同之处在于源可读性对您的影响。

票数 3
EN

Stack Overflow用户

发布于 2016-07-17 07:55:26

早在Java 8之前,我们就不得不使用笨重的旧匿名类语法来处理这类事情,导致代码如下所示:

代码语言:javascript
运行
复制
object.gimmeFunction(new SingleMethodInterface(){
    @Override public bool really(int n){
        return n=="really".hashCode();
    }
});

由于这种模式非常常见(请参阅比较器可运行ActionListener),因此决定该语言可以使用更简洁的语法,因此在Java 8中,我们被赋予兰巴斯将上面的讨厌块转换为:

代码语言:javascript
运行
复制
object.gimmeFunction(n->n=="really".hashCode());

因此,这有助于在任何地方维护Java程序员的理智。两者在功能上是等价的,但前者更灵活,而第二个则要好得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38416701

复制
相关文章

相似问题

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