具有Lambda表达式的本地类

时间:2018-02-20 03:13:05

标签: java lambda java-stream method-reference local-class

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

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方法不是静态方法。城市本身如何调用实例方法?

2 个答案:

答案 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形式的语法糖将方法传递给表达式,在该表达式中调用实例。