懒惰流是在一瞬间评估的吗?

时间:2015-12-12 19:16:08

标签: java java-8 java-stream

据我所知,如果我有一个列表中的延迟流(例如过滤器),那么在我开始对流进行迭代之前,不会检查条件。

但是我想问一下 - 当我开始迭代时,流是迭代所有列表,检查条件,并将所有结果放在“内部列表”中。在一个时刻然后开始迭代并给我内部列表中的元素,或者当它开始迭代时它将仅检查第一个元素;并且在迭代期间,它将检查他当时的每个元素。

此外,我想询问它是否与并行有关。

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

编辑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();

如果在最后一行,则需要几次才能找到第一个元素。

1 个答案:

答案 0 :(得分:0)

您可以通过一些编码轻松地回答这些问题。尝试类似这样的事情:

  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());

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