Java 8 stream operations execution order

后端 未结 5 1546
隐瞒了意图╮
隐瞒了意图╮ 2020-12-28 18:35
List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
List twoEvenSquares = numbers.stream().filter(n -> {
    System.out.println(\"         


        
5条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-28 19:19

    Streams are pull-based. Only a terminal operations (like the collect) will cause items to be consumed.

    Conceptually this means that collect will ask an item from the limit, limit from the map and map from the filter, and filter from the stream.

    Schematically the code in your question leads to

    collect
      limit (0)
        map
          filter
            stream (returns 1)
          /filter (false)
          filter
            stream (returns 2)
          /filter (true)
        /map (returns 4)
      /limit (1)
      limit (1)
        map
          filter
            stream (returns 3)
          /filter (false)
          filter
            stream (returns 4)
          /filter (true)
        /map (returns 16)
      /limit (2)
      limit (2)
      /limit (no more items; limit reached)
    /collect
    

    And this conforms to your first printout.

提交回复
热议问题