【问题标题】:Java 8 Stream: Iterating, Processing and CountJava 8 Stream:迭代、处理和计数
【发布时间】:2016-02-29 20:32:06
【问题描述】:

这样处理和统计处理过的数据可以吗?

long count = userDao.findApprovedWithoutData().parallelStream().filter(u -> {
    Data d = dataDao.findInfoByEmail(u.getEmail());
    boolean ret = false;
    if (d != null) {
        String result = "";
        result += getFieldValue(d::getName, ". \n");
        result += getFieldValue(d::getOrganization, ". \n");
        result += getFieldValue(d::getAddress, ". \n");
        if(!result.isEmpty()) {
            u.setData(d.getInfo());
            userDao.update(u);
            ret = true;
        }
    }
    return ret;
}).count();

所以,简而言之:迭代不完整的记录,如果存在数据则更新并计算此记录数?

【问题讨论】:

标签: java java-8 java-stream side-effects


【解决方案1】:

这取决于您对 process 的定义。我不能给你一个明确的yes or no,因为我认为如果不了解你的代码以及它是如何实现的,就很难得出结论。

您正在使用 Parallel Stream,Java 运行时会根据 ForkJoinPool 的公共池中的可用线程数将 Stream 拆分为子流。

使用parallelism 时需要注意可能的副作用:

  1. 干扰(流中的Lambda表达式不应干扰)

流操作中的 Lambda 表达式不应干扰。 当一个流的源被修改而一个 管道处理流。

  1. 有状态的 Lambda 表达式

避免在流中使用有状态的 lambda 表达式作为参数 操作。有状态 lambda 表达式的结果取决于 在管道执行期间可能发生变化的任何状态。

查看您的问题并将上述几点应用于它。

不干扰 > 强烈声明 Lambda 表达式在管道操作期间不应干扰流源(除非流源是并发的),因为它可能导致:

  • 异常(即 ConcurrentModificationException)
  • 错误答案
  • 不合格行为

除了在中间操作(即过滤器)期间进行修改的行为良好的流之外,请在here 中阅读更多信息。

您的 Lambda 表达式确实会干扰流的源,这是不建议的,但是,干扰在 Intermediate 操作中,现在一切都归结为流是否表现良好。因此,当涉及到干扰时,您可能会考虑重新考虑您的 lambda 表达式。这也可能归结为您如何通过userDao.udpate 更新流的源,这在您的问题中并不清楚。

有状态的 Lambda 表达式 > 您的 Lambda 表达式似乎不是有状态的,这是因为 Lambda 的结果取决于在管道执行期间不会改变的值。所以这不适用于你的情况。

我建议您阅读 Java 8 Stream 的文档以及 blog 的文档,它通过示例很好地解释了 Java 8 Stream。

【讨论】:

    【解决方案2】:

    恕我直言,这是错误的代码,因为:

    过滤谓词有(相当显着的)副作用

    谓词不应该有副作用(就像 getter 不应该一样)。这是出乎意料的,这很糟糕。

    过滤谓词效率很低

    谓词的每次执行都会触发一大串查询,这使得这段代码无法扩展。

    乍一看,主要目的似乎是计数,但实际上这是一个次要(可有可无)的信息

    好的代码让事情变得一目了然(与这段代码不同)

    您应该更改代码以使用(相当简单的)单个更新查询(使用连接)并从持久性 API 结果中的“更新的行数”信息中获取计数。

    【讨论】:

    • 正确编写此代码的策略/概念是什么(无需查看数据库来计算结果)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2015-08-18
    • 2017-09-09
    • 1970-01-01
    相关资源
    最近更新 更多