Java 使用Lambda表达式的列表迭代——局部变量必须是final或final

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");

我正在迭代字符串列表,并检查字符串是否包含冒号:,若包含冒号,则将其拆分并在变量中分配结果。下面的代码可以工作,但是如何使用Java8Lambda表达式有效地编写它

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];

    }