【问题标题】:Equivalent code using java streams for conventional for loop使用 java 流进行常规 for 循环的等效代码
【发布时间】:2021-11-02 11:51:35
【问题描述】:

我需要使用 Java 流转换这个 for 循环代码:

boolean present = false;
for (Long studentKey : studentKeys) {
    if (!studentKey.equals(student.getId())) {
        present= true;
        log.debug(STR_SESSION_BLOCKED_ANOTHER_USER);
    }
}

【问题讨论】:

  • 好的,继续!是什么阻止你这样做? (您可能想阅读How to Ask。)

标签: java-8 java-stream


【解决方案1】:

您可以按照以下说明进行操作:

  • 创建包含if 条件的流实例:studentKeys.stream().filter(key -> !key.equals(student.getId()))

  • 将您的流嵌套在供应商实例中(java.util.function.Supplier 类)。实际上,每个流实例只能被处理一次,并且供应商可以在我们每次需要时重新创建一个新实例。

  • 对您的信息流执行必要的操作(presentlog.debug)。

下面的代码是这样的:

Supplier<Stream<Long>> studentFilter = () ->
        studentKeys.stream().filter(key -> !key.equals(student.getId()));

boolean present = (studentFilter.get().count() != 0L);
studentFilter.get().forEach(key -> log.debug(STR_SESSION_BLOCKED_ANOTHER_USER));

【讨论】:

  • 调用filteredStudentKeys.count()后,流被关闭。调用forEach时会报错。
  • 我忘记了在Java中,每个流只能使用一次。我将使用Supplier 类更新解决方案。
  • 您可以使用.anyMatch(x -&gt; true) 而不是遍历所有 元素并计算它们,只是为了找出是否至少有一个.count() != 0L。鉴于可能多次重复相同的日志消息没有任何优势,您可以简单地使用boolean present = studentKeys.stream() .anyMatch(key -&gt; !key.equals(student.getId())); if(present) log.debug(STR_SESSION_BLOCKED_ANOTHER_USER);。我想,原循环作者的意图是一样的,他们只是忘记了break;
  • @Holger 你说得对,我对break 声明也有同样的想法,但没有考虑到解决方案。我一直保持“相似”的代码行为
  • @hogler 成功了
【解决方案2】:

以上等效代码返回正确的布尔标志

    boolean present = studentKeys.stream() .anyMatch(key -> 
    !key.equals(student.getId())); 
    if(present) log.debug(STR_SESSION_BLOCKED_ANOTHER_USER);

【讨论】:

    猜你喜欢
    • 2012-03-31
    • 2020-06-28
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2021-06-18
    • 2020-07-30
    相关资源
    最近更新 更多