使用Lambda表达式列出迭代 - 局部变量必须是最终的或有效的最终

时间:2017-01-20 08:35:30

标签: java lambda java-8

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

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

在Java 8中尝试了相应的上述代码,但是我收到一个错误,即封闭范围内的局部变量必须是最终的或有效的最终版本。

testList.stream().forEach(str -> {
  if(str.contains(":" )) {
     String[] pair = str.split(":");
    key = pair[0];
    value = pair[1];
  }  
});

1 个答案:

答案 0 :(得分: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];

    }