在我测试时,下面的代码执行没有任何问题。但我无法理解逻辑。有人可以解释一下吗?
public static void main(String[] args) {
List<String> london = new ArrayList<>(Arrays.asList("Chinatown","Croydon","Eden Park"));
class City{
private String name;
City(String name){
this.name = name;
}
public void printCity(){
System.out.println(name);
}
}
london.stream().map(City::new).forEach(City::printCity); //Chinatown,Croydon,Eden Park
}
在上面的示例代码中,我有以下问题。
答案 0 :(得分:5)
在上一个语句中,您当前使用了方法引用。这可以写成如下:
london.stream().map(name -> new City(name)).forEach(city -> city.printCity());
如上所示,map
返回City
个实例。因此,forEach
获取City
个实例,并在每个实例上调用printCity
。
使用方法引用时,City::printCity
与调用City.printCity
不同。见Method References documentation
方法引用只是易于阅读的lambda表达式。
答案 1 :(得分:2)
消费者等同于c -> c.printCity()
,(City c) -> c.printCity()
或某些长匿名类,这是一个非常痛苦的输入。
城市实例是调用的主题。只有City::printCity
形式的语法糖将方法传递给表达式,在该表达式中调用实例。