当前位置: 首页 > 面试题库 >

变量已在方法lambda中定义

樊宏义
2023-03-14
问题内容

考虑以下 几乎可 编译的Java 8代码:

public static void main(String[] args) {

    LinkedList<User> users = null;
    users.add(new User(1, "User1"));
    users.add(new User(2, "User2"));
    users.add(new User(3, "User3"));

    User user = users.stream().filter((user) -> user.getId() == 1).findAny().get();
}

static class User {

    int id;
    String username;

    public User() {
    }

    public User(int id, String username) {
        this.id = id;
        this.username = username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public int getId() {
        return id;
    }
}

您会注意到User user = users.stream().filter((user) -> user.getId() == 1).findAny().get();抛出编译器错误:

变量用户已在方法main(String [])中定义

我的问题是:为什么Lambda表达式会考虑与已经定义的Lambda表达式在同一行 初始化
的变量?我知道Lambda会在外部查找(并使用)局部变量,因此您不能将在Lambda内部使用的变量命名为与外部变量相同。但是为什么 定义的变量
认为 已经 定义?


问题答案:

我们来看一下Java语言规范中的名称及其范围

方法(第8.4.1节),构造函数(第8.8.1节)或lambda表达式(第15.27节)的形式参数的范围是方法,构造函数或lambda表达式的整个主体。

块中的局部变量声明范围(第14.4节)是该声明在其中出现的其余部分, 从其自身的初始化程序开始,
并在该局部变量声明语句的右侧包括其他任何声明

然后,关于阴影和遮盖

只能使用简单名称而不是限定名称来引用局部变量(§14.4),形式参数(§8.4.1,§15.27.1),异常参数(§14.20)和局部类(§14.3)。
(第6.2节)。

在局部变量,形式参数,异常参数或局部类声明的范围内,某些声明是不允许的,因为仅使用简单名称就无法区分已声明的实体。

如果使用局部变量v的名称在v范围内声明新变量,则将导致编译时错误,除非在变量声明在v范围内的类中声明了新变量。

所以,在

User user = users.stream().filter((user) -> user.getId() == 1).findAny().get();

,变量的作用域user是该块中变量之后的所有内容。现在,您尝试使用该变量的名称在范围内声明一个新变量,但不

在声明处于v范围内的类中。

因此会发生编译时错误。(它是在lambda表达式中声明的,而不是在类中声明的。)



 类似资料:
  • 问题内容: 我一直在研究用于自动构建的基本测试框架。下面的代码代表使用不同程序对两台机器之间的通信进行的简单测试。在实际执行任何测试之前,我想完全定义它们- 因此,下面的此测试直到声明所有测试后才真正运行。这段代码只是测试的声明。 无论如何,运行测试后,它将运行“ passIf”定义的功能。由于我想为多个客户端运行该测试,因此我要迭代它们并为每个客户端定义一个测试- 没什么大不了的。但是,在第一个

  • 嘿,所以我试着做了所有的事情,我的代码的要点是把这些字符转换成一个字符串,你可以添加,现在原始代码要复杂得多,但我给了一个过度简化的代码来找出为什么会发生这个错误,如果有人能解释一下为什么?

  • 本文向大家介绍Python判断变量是否已经定义的方法,包括了Python判断变量是否已经定义的方法的使用技巧和注意事项,需要的朋友参考一下 Python判断变量是否已经定义是一个非常重要的功能,本文就来简述这一功能的实现方法。 其实Python中有很多方法可以实现判断一个变量是否已经定义了。这里就举出最常用的两种作为示例,如下所示: 方法一:try except方法: 用法: 方法二:使用命名空间

  • 问题内容: 假设我有一个和一个。我想将每个转换器应用于列表中的每个字符串。 使用Java 8 lambda,我可以这样做: 但是我想做更多类似的事情,但是会导致编译时错误: 我刚刚开始玩lambda,所以也许我只是语法不正确。 问题答案: 使用流执行此操作的最佳方法是使用: 当然,这是假定非空的。如果有可能为空,则使用的两个参数重载来代替就足够简单了,就像这样(假定是一个功能接口): 出现编译器错

  • 问题内容: 我正在做一些实验,无意间写了一段代码,这很奇怪,我还没完全明白。我什至可以编译它,我什至感到惊讶。看起来像这样: 不出所料,无法通过以下方式访问此类元素: 原因是,编译器将在枚举本身内寻找该方法。 我以为不可能从枚举之外访问这些方法和变量。因此,我尝试创建一个参数构造函数,并使用一些内部变量进行调用: 不可能编译这样的构造。现在,我在想如果没有办法访问常量,那么在常量中定义某些东西有什

  • 我在使用GetCircleArea()方法时遇到问题。请帮忙。我坐在这里,不知道该怎么办了。 非常感谢。寻找答案!