我希望在遍历列表使用lambda时得到索引。
例如:
List<CheckBox> checkBoxes = null;
checkBoxes.forEach(checkBox -> {
if (checkBox.isSelected()) {
sb.append("index"); //I want to get checkbox index here
sb.append(",");
}
});
编辑:checkBoxes = null;
只是一个占位符,但在我开始编写代码后会正常使用。
答案 0 :(得分:8)
这是我将如何做到的。
对列表的索引运行IntStream
。然后根据是否选中相应的复选框,过滤索引。然后将索引值int
映射到索引值的String
表示中。最后,将字符串收集到结果字符串中,以逗号分隔。
代码:
String result = IntStream.range(0, checkBoxes.size())
.filter(i -> checkBoxes.get(i).isSelected())
.mapToObj(String::valueOf)
.collect(Collectors.joining(","));
输出类似于
0,1,3,6
取决于实际检查的复选框。
我会避免使用forEach
,因为您可以通过转换值而不是执行副作用来实现目标。我也会避免使用List.indexOf
,因为它会线性搜索列表中的所需项目。如果你只有几个复选框,这不是什么大问题,但是如果你有很多,那么O(N ^ 2)增长会导致性能下降。
答案 1 :(得分:2)
尝试使用IntStream
:
List<CheckBox> checkBoxes = //data
IntStream.range(0, checkBoxes.size())
.forEach(i -> {
CheckBox checkbox = checkBoxes.get(i);
if(checkbox.isSelected()){
sb.append(i);
sb.append(",");
}
});
答案 2 :(得分:1)
试
List<CheckBox> checkBoxes = null;
checkBoxes.forEach(checkBox -> {
if(checkBox.isSelected()){
index = checkBoxes.indexOf(checkBox);
sb.append(index); //I want to get checkbox index here
sb.append(",");
}
});
答案 3 :(得分:1)
lambda 不适用于所有情况,我建议使用传统的for循环。
for(int i = 0; i < checkBoxes.size(); i++){
if(checkBoxes.get(i).isSelected()){
// simply use "i" in this case for the index
sb.append(i); //I want to get checkbox index here
sb.append(",");
}
}
但是,如果您坚持使用流,则需要使用indexOf
提供的List
方法来获取该特定元素的相应索引。
checkBoxes.forEach(checkBox ->{
if(checkBox.isSelected()){
int indexValue = checkBoxes.indexOf(checkBox);
sb.append(indexValue); //I want to get checkbox index here
sb.append(",");
}
});