【问题标题】:Return next element in stream返回流中的下一个元素
【发布时间】:2016-05-28 07:28:15
【问题描述】:

需要获取流中的下一个元素。迭代器呢?

student.getStudentGroupList().forEach(g -> { 
   g.getCourseList().forEach(c -> {         
      c.getThemeList().forEach(t -> {
         if (t.equalsIgnoreId(lastTheme)) {
           //return next 
         }
      });
   }); 
});

【问题讨论】:

  • 这个问题有点不清楚。你想只返回一个“下一个”元素并退出循环吗?如果只需要返回一个元素,那么如果下一个元素也满足条件怎么办?它应该被退回,还是应该被跳过?或者你只想跳过所有满足条件的元素,收集所有剩余的不满足条件的元素?
  • @kordirko 是的,我只想返回一个元素。如果 prev 满足条件并对其进行一些操作,则返回下一个元素。我更新了我的帖子,我认为这很清楚。
  • @ArtemDumanov,目前还完全不清楚。请为您的问题发布所需的输入和所需的输出。

标签: java list collections iterator java-stream


【解决方案1】:

鉴于您有多个嵌套的forEach 调用,将这一切“扁平化”为单个流的方法是使用flatMap

student.getStudentGroupList().stream()
       .flatMap(g -> g.getCourseList().stream())
       .flatMap(c -> c.getThemeList().stream())
       ...

这将为您提供来自所有学生组的所有课程的所有主题流。

如果您想获取匹配元素之后的下一个元素,请使用此技术(仅限 Java 9):删除前导的不匹配元素,跳过下一个元素(即第一个匹配项),然后获取以下元素。

       ...
       .dropWhile(t -> !yourCondition(t))
       .skip(1)
       .findFirst();

这将返回包含所需元素的 Optional<Theme>,如果没有主题满足您的条件,或者如果满足但没有后续元素,则返回一个空的可选项。

在您的示例中,您将主题与 lastTheme 进行比较,这向我表明条件与流中的前一个元素有关。如果是这样的话,那就和我上面说的不一样了,如果是这样,请澄清一下。

【讨论】:

    【解决方案2】:

    试试这个:

    while (iter.hashNext()) {
        currentElement = iter.hasNext()
        if(//if iter.hashNext() and if currentElement satisfies the predicate) { 
    
           return iter.next();
    
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 2021-11-05
      相关资源
      最近更新 更多