java - 将 Java 匿名内部类转换为 Lambda 表达式后,范围会发生什么变化?

标签 java lambda scope

来自Java8 Lambdas vs Anonymous classes :
“...[匿名内部类] 引入了一个新的范围。也就是说,名称是从 AIC 的父类(super class)和接口(interface)解析的,并且可以隐藏在词法封闭环境中出现的名称。对于 lambda,所有名称都是按词法解析的。”

鉴于上述有关作用域的陈述,如果只是将其简单地转换为 Lambda,执行方式不同的 Java 匿名内部类会是什么样子?

这两段代码看起来表现相同:

    button.addClickHandler(clickEvent -> doSomething());

    button.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                doSomething();
            }
    });

但是如果内部方法是doSomething(this),情况会是这样吗?或doSomething(myVariable)

范围变化很​​重要的情况及其行为方式的示例将是 super 棒的。我知道 Lambda 与匿名内部类还有其他不同之处,但我还没有找到任何好的解释。

最佳答案

考虑以下示例:

import java.util.function.Function;

public class Main {
    private static abstract class ParentClass implements Function<String, String> {
        protected String prefix = "parent_class_";
    }

    public static void main(String... args) {
        String prefix = "local_";
        printString("test", new ParentClass() {
            @Override
            public String apply(String s) {
                return prefix + s;
            }
        });
        printString("test", s -> prefix + s);
    }

    private static void printString(String baseString, Function<String, String> stringMapper) {
        System.out.println(stringMapper.apply(baseString));
    }
}

这会打印

parent_class_test

local_test

特别地,AIC 中的 prefix 指的是父类中的字段,而 lambda 中的 prefix 指的是局部变量。

关于java - 将 Java 匿名内部类转换为 Lambda 表达式后,范围会发生什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41840236/

相关文章:

c++ - 枚举作为函数参数

javascript - 如何在 angular.js 中调用 ng-title 属性上的作用域函数

java - 如何动态更改卡号输入掩码(Android,Java)

Java:为什么同步列表会出现 ConcurrentModificationException?

java - ArrayList 中的弹跳球需要检测碰撞

java - 将 Maven 依赖项添加回 GraphHopper 的类路径会导致工作中的 Tomcat 服务器失败

c# - 有人能告诉我为什么这个 lambda 排序表达式不起作用吗?

python - Python 中的 filter、map 和 reduce 是否创建列表的新副本?

java - 将国家/地区域功能转换为 Java8 Lambda

javascript - 如何让跨多个文件的多个 JavaScript 对象访问同一个私有(private)变量?