Java 使用Lambda表达式的列表迭代——局部变量必须是final或final
我正在迭代字符串列表,并检查字符串是否包含冒号:,若包含冒号,则将其拆分并在变量中分配结果。下面的代码可以工作,但是如何使用Java8Lambda表达式有效地编写它Java 使用Lambda表达式的列表迭代——局部变量必须是final或final,java,lambda,java-8,Java,Lambda,Java 8,我正在迭代字符串列表,并检查字符串是否包含冒号:,若包含冒号,则将其拆分并在变量中分配结果。下面的代码可以工作,但是如何使用Java8Lambda表达式有效地编写它 String key = null; String value = null; List<String> testList = new ArrayList<>(); testList.add("value1"); testList.add("value2"); testList.add("value3");
String key = null;
String value = null;
List<String> testList = new ArrayList<>();
testList.add("value1");
testList.add("value2");
testList.add("value3");
testList.add("value4");
testList.add("value5:end");
for(String str : testList) {
if(str.contains(":" )) {
String[] pair = str.split(":");
key = pair[0];
value = pair[1];
}
}
也许你应该考虑这个方法:
String key = null;
String value = null;
List<String> testList = new ArrayList<>();
testList.add("value1");
testList.add("value2");
testList.add("value3");
testList.add("value4");
testList.add("value5:end");
Optional<String> optString = testList.stream().map(str -> {
if (str.contains(":")) return str;
else return null;
})
.filter(str -> str != null)
.findAny();
if(optString.isPresent()){
String []pair = optString.get().split(":");
key = pair[0];
value = pair[1];
}
如果有多个字符串包含冒号,您希望发生什么?您的工作代码只会注意最后一个,这似乎并不理想。问题是键和值不是最终的。lambda与匿名类非常相似,因此请尝试使用正在传递的接口的匿名实现进行第一次截断,您应该会得到相同的错误。然后阅读涉及匿名类时变量的作用域,例如:这里:还要考虑如果使用并行流,并且有多个字符串与条件匹配,会发生什么情况:key和value的值应该是什么?如果要使用流,应该使用流API,而不是尝试为循环使用不同的语法。→ 可选o=testList.stream.filterstr->str.contains:.mapstr->str.split:.findFirst;这是否是对这个简单示例的改进,是另一个问题…有条件地映射到null是没有意义的,只是在之后过滤掉null值。为什么不首先根据条件进行过滤呢?→ .过滤器tr->str.包含:
String key = null;
String value = null;
List<String> testList = new ArrayList<>();
testList.add("value1");
testList.add("value2");
testList.add("value3");
testList.add("value4");
testList.add("value5:end");
Optional<String> optString = testList.stream().map(str -> {
if (str.contains(":")) return str;
else return null;
})
.filter(str -> str != null)
.findAny();
if(optString.isPresent()){
String []pair = optString.get().split(":");
key = pair[0];
value = pair[1];
}