【问题标题】:Java Stream with ForEach iteration issue带有 ForEach 迭代问题的 Java Stream
【发布时间】:2015-10-21 16:07:44
【问题描述】:

我有两种类型的处理实现。不知道为什么流 forEach 循环抱怨变量“我”必须是最终的。但是如果是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);
}

【问题讨论】:

  • 虽然数字常量的含义可以从上下文中推导出来,但没有理由使用4857 代替'0''9'...
  • 关于字符 ascii 值替换的要点。

标签: java foreach java-8 java-stream


【解决方案1】:

您可以将forEach 替换为reduction。例如:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2019-05-07
    • 2012-03-03
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    相关资源
    最近更新 更多