gpt4 book ai didi

java - for 循环中的最终计数器?

转载 作者:太空狗 更新时间:2023-10-29 22:44:59 24 4
gpt4 key购买 nike

我有这个代码:

    List<Runnable> r = new ArrayList<>();
for(int i = 0; i < 10; i++) {
r.add(new Runnable() {

@Override
public void run() {
System.out.println(i);
}
});
}

它显然不能编译,因为 i 需要是 final 才能在匿名类中使用。但我不能让它成为最终的,因为它不是。你会怎么做?一个解决方案是复制它,但我认为可能有更好的方法:

    List<Runnable> r = new ArrayList<>();
for(int i = 0; i < 10; i++) {
final int i_final = i;
r.add(new Runnable() {

@Override
public void run() {
System.out.println(i_final);
}
});
}

编辑 为了清楚起见,我在这里为了示例使用了 Runnable,问题实际上是关于匿名类的,它可以是任何其他内容。

最佳答案

我认为您的解决方案是最简单的方法。

另一种选择是将内部类的创建重构为一个为您完成它的工厂函数,然后您的循环本身可以像这样干净:

List<Runnable> r = new ArrayList<>();
for(int i = 0; i < 10; i++) {
r.add(generateRunnablePrinter(i));
}

工厂函数可以只声明一个最终参数:

private Runnable generateRunnablePrinter(final int value) {
return new Runnable() {
public void run() {
System.out.println(value);
}
};
}

我更喜欢这种重构方法,因为它使代码更清晰,相对 self 描述,并且还隐藏了所有内部类管道。

题外话:如果你认为匿名内部类等同于闭包,那么generateRunnablePrinter实际上是一个高阶函数。谁说你不能用 Java 进行函数式编程:-)

关于java - for 循环中的最终计数器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9682942/

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