首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java 8函数调用

java 8函数调用
EN

Stack Overflow用户
提问于 2015-06-18 16:22:25
回答 2查看 6.6K关注 0票数 5

从过去的几个月开始,我就一直在使用Java 8,并试图把我的注意力放在lambdas上。我对音乐会有相当多的了解。但与自定义函数接口执行相挣扎,如lambda调用。

如果我创建java双边接口实现

代码语言:javascript
复制
BiFunction<t1,t2,R> trade = (t1, t2) -> {
  // calling another method for merger
  return t1,t2;
};

我能把它叫做兰巴达吗就像下面一样?

代码语言:javascript
复制
(a, b)-> trade: 

还是必须创建执行方法?

代码语言:javascript
复制
private int execute(BiFunction<t1,t2,R> trade, int a, int b){ 
    return trade.apply(a, b)
}

下面是调用lambda的代码示例:

代码语言:javascript
复制
BiFunction<t1,t2,R> trade = (t1, t2) -> {
                                         // calling another method for merger return t1+t2;
                                        };

public static void main(String[] args) {
  execute(trade , 1, 2);
}

private int execute(BiFunction<t1,t2,R> trade, int a, int b) {
  return trade.apply(a, b);
}

我很好奇为什么编译器不能理解这一点。

代码语言:javascript
复制
public static void main(String[] args) { int i= (1,2) -> trade; }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-18 17:36:21

如果你是一个长时间的Java程序员,新的lambda的东西可能会令人困惑--它是(是吗?)对我来说。Lambdas是一个上下文构造,编译器根据使用它的上下文来解释,就像许多其他脚本语言一样。在大多数情况下,您不需要创建自己的子类型,因为编译器是根据您使用它们的位置为您创建的。客观上,我们认为,“是的,我知道。呃。”但很难让你的大脑改变思维模式。这是我认为许多开发人员需要克服的重大障碍之一。

我可以看到我们想要的想法,“天,我想要我自己的BiConsumer,它连接两个Strings并将它们添加到一个List中。”因此,您可以在您最喜欢的IDE中生成类文件,并获得

代码语言:javascript
复制
public static class StringConcat implements BiConsumer<String,String>{
    private List<String> values = new ArrayList<>();

    @Override
    public void accept(String s, String s2) {
        values.add(s,s2);
    }
}

当你去尝试找到一个好的用途,你似乎真的找不到。那是因为没有必要创建一个。

我一直很难找到这样一种情况:我需要创建自己的类来实现任何java.util.function内容。不是说没有病例,我只是没有发现太多的病例。

归根结底,当你有一个类型有一个抽象的方法,比如Comparable.compare(T t1, T t2)Runnable.run()时,就会识别它。在这些情况下,您只需将lambda构造内联。

因此,使用我的StringConcat的功能,给定一个Map<String,String> map

代码语言:javascript
复制
    // I just passed it a new BiConsumer!
    map.forEach((k,v)-> list.add(k+v));

编辑:经过你的评论和重新阅读你的问题,我认为你仍然有一些精神障碍。看起来,您似乎想声明一个lambda,实例化它,并按三个不同的步骤调用它。这样做是不符合目的的。当您使用lambdas时,在创建lambda时执行前两个步骤。

代码语言:javascript
复制
//                      declare AND instantiate
stringList.stream().map(string -> Integer.parseInt(string))...

这是说,“对于列表中的每一个字符串,应用这个函数,Integer.parseInt(string)。”请注意,您从未调用过apply()。这是在map方法中完成的。这就避免了创建实例并单独尝试调用它时所做的工作。

兰巴不是一颗神奇的子弹。在大多数情况下,仍然需要具有不同语句的单独方法。也许您想要的功能不太适合lambdas。

票数 6
EN

Stack Overflow用户

发布于 2015-06-18 16:41:05

你用这样的羔羊

代码语言:javascript
复制
public static void main(String[] args) {
    BiFunction<Integer, Integer, Integer> add = (x, y) -> {
        return x + y;
    };
    System.out.println(add.apply(1, 2));
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30920772

复制
相关文章

相似问题

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