gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:59:54 25 4
gpt4 key购买 nike

来自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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com