具有 Lambda 表达式的本地 类
Local classes with Lambda expressions
根据我的测试,下面的代码可以毫无问题地执行。但我无法理解其中的逻辑。有人可以解释一下吗?
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
}
在上面的示例代码中,我有以下问题。
- foreach 方法始终采用消费者对象。这里的 printCity 方法不是带参数的方法。仍然有效。怎么样?
- printCity 方法在这里不是静态方法。 City 本身如何调用实例方法?
在您的上一条语句中,您当前使用了方法引用。这也可以写成如下:
london.stream().map(name -> new City(name)).forEach(city -> city.printCity());
正如您在上面看到的,map
returns City
个实例。因此 forEach
获得 City
个实例并在每个实例上调用 printCity
。
使用方法引用时,City::printCity
与调用City.printCity
不同。参见 Method References documentation
Method references are just easy-to-read lambda expressions.
消费者相当于 c -> c.printCity()
、(City c) -> c.printCity()
或一些冗长的匿名 class,输入时非常痛苦。
城市实例是调用的主题。只有 City::printCity
形式的语法糖将方法传递给调用实例的表达式。
根据我的测试,下面的代码可以毫无问题地执行。但我无法理解其中的逻辑。有人可以解释一下吗?
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
}
在上面的示例代码中,我有以下问题。
- foreach 方法始终采用消费者对象。这里的 printCity 方法不是带参数的方法。仍然有效。怎么样?
- printCity 方法在这里不是静态方法。 City 本身如何调用实例方法?
在您的上一条语句中,您当前使用了方法引用。这也可以写成如下:
london.stream().map(name -> new City(name)).forEach(city -> city.printCity());
正如您在上面看到的,map
returns City
个实例。因此 forEach
获得 City
个实例并在每个实例上调用 printCity
。
使用方法引用时,City::printCity
与调用City.printCity
不同。参见 Method References documentation
Method references are just easy-to-read lambda expressions.
消费者相当于 c -> c.printCity()
、(City c) -> c.printCity()
或一些冗长的匿名 class,输入时非常痛苦。
城市实例是调用的主题。只有 City::printCity
形式的语法糖将方法传递给调用实例的表达式。