Java-获取循环迭代器到循环内部的函数?

问题描述

| 我在这里面临一个愚蠢的问题...基本上,我处于For循环中,在此循环中,我始终调用函数来创建按钮。但是在此功能中,我想传递循环迭代器,因为它正在不断变化以区分按钮。但是然后它告诉我,我需要使循环迭代器为“ final \”,这意味着它不会改变! 好吧,我的问题将通过一些基本代码变得更有意义:
for(int i = 0; i < appList.size(); i++) { 

                //some other stuff including creating the below button \'btn\'

                btn.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        //set some attribute based on i
                        //but when I do this it only sets based on the greatest value of i (!)
                    }
                });
}
嗯,我知道这是一个愚蠢的问题...虽然我是Java新手! 干杯。     

解决方法

        
for(int i = 0; i < appList.size(); i++) { 

    final int _i = i;

    btn.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // use _i instead of i
        }
    });
}
    ,        考虑以下愚蠢的示例代码:
int i = 0;
obj.invokeThunkAfter10Seconds(new ThunkObject() {
    public void thunk() {
        System.out.println(i);
    }
}
i = 1;
ThunkObject
拥有对
i
的引用,但是change4ѭ可以更改,这使得输出无法预测,并且取决于when4ѭ何时更改以及何时调用
thunk
。 由于Java没有适当的闭包(根据设计,请参见无法在用其他方法定义的内部类中引用非最终变量),因此明确不允许您捕获此类非最终(即可更改)变量。 相反,您必须声明变量
final
,这意味着它已初始化且不可更改。这意味着内部类捕获到“ 4”之后就再也无法更改。
final int i = 0;
obj.invokeThunkAfter10Seconds(new ThunkObject() {
    public void thunk() {
        System.out.println(i);
    }
}
// Can\'t change i here. It will forever now be 0.
在您的示例中,您不能仅将ѭ4设置为final,因为您确实想在每次循环迭代中更改该值。相反,您可以在最终变量中创建值的副本:
for(int i = 0; i < appList.size(); i++) { 
    //some other stuff including creating the below button \'btn\'

    final int capturedI = i;
    btn.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            //set some attribute based on capturedI
        }
    });
}
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...