【问题标题】:Lazy stream are evaluated all in one moment? [duplicate]懒惰的流在一瞬间被评估? [复制]
【发布时间】:2015-12-12 19:16:07
【问题描述】:

我了解,如果我有来自列表的惰性流(例如过滤器),则在我开始对流进行迭代之前,不会开始检查条件。

但我想问一下——当我开始迭代时,流是否迭代了所有列表,检查条件,并将所有结果放入“内部列表”中。一会儿然后开始迭代并给我内部列表中的元素,或者当它开始迭代时它只会检查第一个元素;并且在迭代过程中它会在他的时间检查每个元素。

另外我想问一下是否是平行的。

(我在这个网站上看到了多个问题,主题是“当惰性流迭代时”,但不是这个特定的问题 - 如果它一次迭代是一点点的,所以不要将它标记为重复,直到你看到它是完全相同的问题)

EDIT 3(编辑示例以使其清晰)- 例如:

    ArrayList<Integer> list=new ArrayList<Integer>(); 
    for(int i=0;i<10000;i++)
        list.add(i);//fill the list with integers

    Iterator<Integer> iterator=list.stream().filter(j->j%2==0).iterator();

    iterator.next();

如果在最后一行,是否需要花费一些时间才能找到第一个元素。

【问题讨论】:

  • @dima 我来自这个问题......一般来说,懒惰的流不会立即迭代,但没有解释是否 - 当它迭代时 - 它一次或一点迭代在迭代过程中逐位
  • 我想我不太明白你的问题。流不仅限于有限的集合——它们也可以来自无限的来源。您是在问流是否可以提前终止,或者它是否在处理时提前退出?
  • @Makoto 我在问它如何与集合一起工作,如果所有集合在我得到任何元素之前迭代一次,或者它只迭代一个元素
  • @gits you're write' 我当然错过了一些东西!
  • 你的问题真的不清楚。你想解决什么问题?你想了解什么?

标签: java java-8 java-stream


【解决方案1】:

您可以通过一些编码轻松地为自己回答此类问题。例如尝试这样的事情:

  List<Integer> ints = Arrays.asList(0,1,2,3,4,5,6,7,8,9,10)
   .stream()
   .peek(i -> System.out.println("Peek 1: " + i))
   .filter( i -> i  < 10)
   .peek(i -> System.out.println("Peek 2: " + i))
   .map (i -> String.valueOf(i))
   .peek(i -> System.out.println("Peek 3: " + i))
   .map (i -> Integer.parseInt(i))
   .peek(i -> System.out.println("Peek 4: " + i))
   .filter( i -> i < 10)
   .peek(i -> System.out.println("Peek 5: " + i))
   .collect(Collectors.toList());

运行它,看看它是否有意义。

【讨论】:

  • 好的,我试过这样的,我想我理解得更好
猜你喜欢
  • 2017-01-13
  • 2019-01-07
  • 2015-05-06
  • 2016-05-12
  • 2014-10-10
  • 1970-01-01
  • 2015-09-06
  • 1970-01-01
  • 2016-12-14
相关资源
最近更新 更多