0

正如我测试的那样,下面的代码执行没有任何问题。但我无法理解其中的逻辑。有人可以解释一下吗?

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
}

在上面的示例代码中,我有以下问题。

  1. foreach 方法始终采用消费者对象。在这里 printCity 方法不是带参数的方法。它仍然有效。如何?
  2. printCity 方法在这里不是静态方法。City 本身如何调用实例方法?
4

2 回答 2

5

在您的最后一条语句中,您当前使用了方法引用。这也可以写成如下:

london.stream().map(name -> new City(name)).forEach(city -> city.printCity());

正如您在上面看到的,map返回City实例。所以forEach获取City实例并调用printCity每个实例。

使用方法引用时,City::printCity与调用City.printCity. 请参阅方法参考文档

方法引用只是易于阅读的 lambda 表达式。

于 2018-02-20T03:37:40.633 回答
2

消费者相当于类似c -> c.printCity(),(City c) -> c.printCity()或一些冗长的匿名类,输入起来非常痛苦。

城市实例是调用的主题。只是语法糖的形式City::printCity将方法传递给调用实例的表达式。

于 2018-02-20T03:37:48.030 回答