什么时候知道我是否可以使用lambda的双结肠?

时间:2017-02-16 00:55:52

标签: java lambda

以下几行中,为什么第一个和最后一个允许?

List<String> l = new ArrayList<>();

l.stream().forEach(System.out::println);//compiles
l.stream().forEach(System.out.println(String::compareTo));//doesnt compile
l.stream().forEach(String::compareTo);// doesnt compile 

String comparedWith = "";

l.stream().forEach(comparedWith::compareTo);//compiles why ?

修改

如果https://codepen.io/adamoliver/pen/pRYXeB采用一个参数,那么它是否也有效?

如果根据文件:

  

表示接受单个输入参数的操作   没有结果。与大多数其他功能接口不同,{@ code   预计消费者将通过副作用进行操作。

3 个答案:

答案 0 :(得分:2)

  

l.stream()的forEach(的System.out ::的println); //编译

这会针对每个项目调用println System.out方法。此处System.out::println(String x) -> System.out.println(x)相同。

  

l.stream()。forEach(System.out.println(String :: compareTo)); //不编译

你知道函数调用是如何工作的,对吗?首先调用(System.out.println(String::compareTo),然后调用l.stream().forEach(result of that println call)println除外void,因此无效。

  

l.stream()。forEach(String :: compareTo); //不编译

此处String::compareTo(String x, String y) -> x.compareTo(y)相同,后者带有两个参数。但是forEach需要一个带有一个参数的lambda。

String comparisonwith =&#34;&#34 ;;

  

l.stream()。forEach(comparisonWith :: compareTo); //编译为什么?

此处comparedWith::compareTo(String x) -> comparedWith.compareTo(x)相同。这需要一个参数,因此它有效。

答案 1 :(得分:1)

forEach将获取集合的每个元素并将其传递给您的函数。所以,你的函数只需要一个参数。

在您的情况下,println接受一个参数,因此它适合每个接受的操作。当您获取String的实例(comparisonWith)并调用compareTo时,它将获取一个参数并将当前字符串(在您的情况下为空字符串)与您的参数进行比较。 String中没有名为compareTo的静态方法,因此String :: compareTo不起作用。

答案 2 :(得分:1)

双冒号或更准确地称为&#34;方法参考&#34;是指选择一个将被调用的方法。

在调用方法时,重要的是匹配提供的和预期的参数的数量。

正如你可以轻易扣除的那样,这些数字与你的第二个例子不相符。