【问题标题】:Java 8- forEach method iterator behaviourJava 8-forEach 方法迭代器行为
【发布时间】:2016-09-19 09:50:42
【问题描述】:

我最近开始检查 Java 8 的新功能。

我遇到过这个forEach 迭代器——它迭代集合。

假设我有一个ArrayList 类型为<Integer>,其值= {1,2,3,4,5}

list.forEach(i -> System.out.println(i));

此语句遍历一个列表并打印其中的值。

我想知道我将如何指定我希望它仅迭代某些特定值。

就像,我希望它从第二个值开始并迭代它直到第二个最后一个值。或类似的东西 - 或替代元素。

我该怎么做?

【问题讨论】:

  • list.subList(2, list.size()-2).forEach(…) 从字面上理解您的问题。

标签: foreach iterator java-8


【解决方案1】:

要迭代原始列表的一部分,请使用 subList 方法:

list.subList(1, list.length()-1)
    .stream() // This line is optional since List already has a foreach method taking a Consumer as parameter
    .forEach(...);

【讨论】:

  • 哦,看起来很棒。但是,如果我想从列表中选择所有其他元素,例如 1、3、5、...,那么 @BoristheSpider 的答案是否合适?
  • @inityk 我会这样做IntStream.iterate(0, i -> i+2).limit(list.size()/2).map(list::get)。但这仅适用于支持RandomAccessList 实现。
  • @Joni,只是一个小修正,list.size() 将代替 list.length() 除了这个小变化,答案是完美的!
  • @BoristheSpider,根据你的评论,list::get 它会如何选择list.get(index)?你能解释一下那部分吗?
  • 不需要stream,直接使用foreach
【解决方案2】:

这是流的概念。在一个操作之后,该操作的结果将成为下一个操作的输入。

因此,对于您的具体示例,您可以遵循@Joni 的命令。但是,如果您一般要求,那么您可以创建一个过滤器来仅获取您想要循环的值。

例如,如果您只想打印偶数,您可以在 forEached 之前对流创建一个过滤器。像这样:

List<Integer> intList = Arrays.asList(1,2,3,4,5);

intList.stream()
       .filter(e -> (e & 1) == 0)
       .forEach(System.out::println);

您可以类似地在流上到达终端操作(在您的情况下为 forEach)之前选择要循环的内容。我建议您阅读此流教程以更好地了解它们的工作原理:http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/

【讨论】:

  • 当然。还有其他流教程,但我认为这是最容易遵循的。如果我的回答回答了您的问题,请考虑接受它,而不是仅仅支持它;)
  • 是的,我肯定会这样做——我要问的是我想遍历偶数或奇数索引。 for(int i = 0;i&lt;list.size(); i+=2)这种事。我怎么做到的?
  • 你现在要问的是一个不同的问题 :) 流没有索引,但如果你真的想要一个索引,你可以看看这个问题:stackoverflow.com/questions/22793006/…
  • 但实际上在需要操作索引的情况下,它的代码更简洁,只需使用老式的 for 循环即可。流并不意味着完全取代 for 循环
  • 哦,真的吗?听起来不错的建议
猜你喜欢
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 2011-07-29
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
相关资源
最近更新 更多