以下几行中,为什么第一个和最后一个允许?
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 预计消费者将通过副作用进行操作。
答案 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;是指选择一个将被调用的方法。
在调用方法时,重要的是匹配提供的和预期的参数的数量。
正如你可以轻易扣除的那样,这些数字与你的第二个例子不相符。