java - 在内部类中访问 for 循环变量的最佳实践

标签 java android arrays iteration anonymous-inner-class

在制作 Android 应用程序时,我遇到了有关从内部类访问非最终变量的问题。二手 This作为引用。

我想问一下什么是“正确”和有效的方法来做到这一点? 我的两个解决方案如下:

for (Button b : buttonArray) {
      final Button bb = b;
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                text.append(bb.getText().toString());
                //Appending "1".."0" to a textView
            }
        });
    }

 for (final Button b : buttonArray) {...}

//请随时提出更好的方法。后面我会尝试使用lambda表达式来美化代码

最佳答案

这之间没有性能差异:

for (Button b : buttonArray) {
      final Button bb = b;
     ...
     ...

还有这个:

for (final Button b : buttonArray) {...}

但是,我推荐第二种方法,因为我认为创建一个新变量指向内存中与您随后操作的迭代变量相同的对象是冗余。 p>

此外,使用 lambda 表达式可以使代码更简洁:

for (Button b : buttonArray) {
     b.addActionListener(v -> {
         text.append(b.getText().toString());
     });
}

请注意,在这种情况下,我们甚至不需要将迭代变量声明为 final,因为它已经满足 effectively final 规则。

顺便说一句,您可以像这样使用流来转换整个代码:

Arrays.stream(buttonArray).forEach(button -> {
      button.addActionListener(v -> {
           text.append(button.getText().toString());
      });
});

关于java - 在内部类中访问 for 循环变量的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47743746/

相关文章:

java - Android 获取捕获的图像元数据

java - 使用 Hashmap 进行字符串分组

java - 如何将我的代码变成异步任务?

android - 在 Android 中替换 fragment 的奇怪行为

c# - 如何比较 C# 中的多维数组?

java - 忽略 EditText setOnClickListener 代码即可编辑文本

java - Eclipse EE IDE 中的 Servlet 和 JSP 与 MYSQL 数据库的连接

android - 如何检查此人在哪里使用 gps。安卓

c++ - 如何将 int 数组转换为位图对象?

arrays - Matlab:将int数组转换为字符串数组?