从过去的几个月开始,我就一直在使用Java 8,并试图把我的注意力放在lambdas上。我对音乐会有相当多的了解。但与自定义函数接口执行相挣扎,如lambda调用。
如果我创建java双边接口实现
BiFunction<t1,t2,R> trade = (t1, t2) -> {
// calling another method for merger
return t1,t2;
};我能把它叫做兰巴达吗就像下面一样?
(a, b)-> trade: 还是必须创建执行方法?
private int execute(BiFunction<t1,t2,R> trade, int a, int b){
return trade.apply(a, b)
}下面是调用lambda的代码示例:
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);
}我很好奇为什么编译器不能理解这一点。
public static void main(String[] args) { int i= (1,2) -> trade; }发布于 2015-06-18 17:36:21
如果你是一个长时间的Java程序员,新的lambda的东西可能会令人困惑--它是(是吗?)对我来说。Lambdas是一个上下文构造,编译器根据使用它的上下文来解释,就像许多其他脚本语言一样。在大多数情况下,您不需要创建自己的子类型,因为编译器是根据您使用它们的位置为您创建的。客观上,我们认为,“是的,我知道。呃。”但很难让你的大脑改变思维模式。这是我认为许多开发人员需要克服的重大障碍之一。
我可以看到我们想要的想法,“天,我想要我自己的BiConsumer,它连接两个Strings并将它们添加到一个List中。”因此,您可以在您最喜欢的IDE中生成类文件,并获得
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
// I just passed it a new BiConsumer!
map.forEach((k,v)-> list.add(k+v));
编辑:经过你的评论和重新阅读你的问题,我认为你仍然有一些精神障碍。看起来,您似乎想声明一个lambda,实例化它,并按三个不同的步骤调用它。这样做是不符合目的的。当您使用lambdas时,在创建lambda时执行前两个步骤。
// declare AND instantiate
stringList.stream().map(string -> Integer.parseInt(string))...这是说,“对于列表中的每一个字符串,应用这个函数,Integer.parseInt(string)。”请注意,您从未调用过apply()。这是在map方法中完成的。这就避免了创建实例并单独尝试调用它时所做的工作。
兰巴不是一颗神奇的子弹。在大多数情况下,仍然需要具有不同语句的单独方法。也许您想要的功能不太适合lambdas。
发布于 2015-06-18 16:41:05
你用这样的羔羊
public static void main(String[] args) {
BiFunction<Integer, Integer, Integer> add = (x, y) -> {
return x + y;
};
System.out.println(add.apply(1, 2));
}https://stackoverflow.com/questions/30920772
复制相似问题