有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有ForEach迭代问题的Java流

我有两种类型的处理实现。不确定为什么stream forEach循环抱怨变量“i”必须是final。但如果是最终的,那么如何用计算“i”的逻辑来解决这个问题呢

public static void main(String[] args) {
    String str = "123456789";
    int i = 0;
    //Non Stream
    for (char c : str.toCharArray()) {
        if (c >= 48 && c <= 57) {
            i = i * 10 + (c - 48);
        }
    }
    System.out.println(i);
     i = 0;
    // WHY compiler fails for variable 'i' here? 
    str.chars().forEach((c) -> {
        if (c >= 48 && c <= 57) {
            i = i * 10 + (c - 48);
        }
    });
    System.out.println(i);
}

共 (1) 个答案

  1. # 1 楼答案

    可以用reduction替换forEach。例如:

    int i = str.chars()
               .filter( c -> c >= 48 && c <= 57 )
               .reduce( 0, (a, b) -> a * 10 + (b - 48) );
    

    这里,0是初始值,lambda表达式计算新值a是最新计算的结果,b是流中的下一个元素。实际上,累加器保持在减速器内,而不是使用局部变量来跟踪(累积)最新计算