代码之家  ›  专栏  ›  技术社区  ›  NullPointer

Java8中迭代器和拆分器的区别

  •  9
  • NullPointer  · 技术社区  · 6 年前

    我在学习的时候就知道了 Parallelism 是一个主要的优势 Spliterator .

    这可能是一个基本问题,但有人能解释一下 Iterator 分路器 举几个例子?

    2 回复  |  直到 6 年前
        1
  •  10
  •   Eugene    6 年前

    对我来说,这些名字是不言而喻的。 Spliterator = 可拆分迭代器 :它可以拆分一些源,也可以迭代它。它的功能与 Iterator 但是有了额外的东西 分裂 分成多个部分,这就是 trySplit 是的。并行处理需要拆分。

    迭代器 总是有一个未知的大小,您只能通过 hasNext/next A 分路器 可以提供大小(从而在内部改善其他操作);或者通过 getExactSizeIfKnown 或者近似的通过 estimateSize .

    另一方面, tryAdvance 是什么? 下一个/下一个 来自 迭代器 但这是一个单一的方法,对IMO的解释要容易得多。 forEachRemaining 在默认实现中委托给 技术进步 但不一定总是这样。(见 ArrayList 例如)

    拆分器也是一个“更智能”的迭代器,通过它的内部属性 DISTINCT SORTED 等(在实现自己的 分路器 )这些标志在内部用于禁用不必要的操作,也称为优化,例如:

     someStream().map(x -> y).count();
    

    因为流的大小不会改变, map 可以完全跳过,因为我们所做的就是数数。

    如果需要,可以围绕迭代器创建一个拆分器,方法是:

    Spliterators.spliteratorUnknownSize(yourIterator, properties)
    
        2
  •  8
  •   Pankaj Singhal    6 年前

    Iterator 是可以迭代的一系列元素的简单表示。

    如:

     List<String> list = Arrays.asList("Apple", "Banana", "Orange");
     Iterator<String> i = list.iterator();
     i.next();
     i.forEachRemaining(System.out::println);
    
    #output
    Banana
    Orange
    

    Spliterator 可用于将给定的元素集拆分为多个集,以便我们可以独立地对不同线程中的每个集执行某种操作/计算,可能会利用并行性。它被设计成迭代器的并行模拟。除集合外,拆分器所覆盖元素的源可以是数组、IO通道或生成器函数。

    有两种主要的方法 分路器 接口。

    -tryadvance()和foreachremining()。

    使用tryadvance(),我们可以一个接一个地遍历底层元素(就像迭代器.next())。如果存在剩余的元素,则此方法对其执行使用者操作,返回true;否则返回false。

    对于连续的批量遍历,我们可以使用foreachremaining():

     List<String> list = Arrays.asList("Apple", "Banana", "Orange");
     Spliterator<String> s = list.spliterator();
     s.tryAdvance(System.out::println);
     System.out.println(" --- bulk traversal");
     s.forEachRemaining(System.out::println);
    
     System.out.println(" --- attempting tryAdvance again");
     boolean b = s.tryAdvance(System.out::println);
     System.out.println("Element exists: "+b);
    

    输出:

    Apple
     --- bulk traversal
    Banana
    Orange
     --- attempting tryAdvance again
    Element exists: false
    

    -拆分器Trysplit())

    将此拆分器拆分为两个,并返回新的拆分器:

      List<String> list = Arrays.asList("Apple", "Banana", "Orange");
    
      Spliterator<String> s = list.spliterator();
      Spliterator<String> s1 = s.trySplit();
    
      s.forEachRemaining(System.out::println);
      System.out.println("-- traversing the other half of the spliterator --- ");
      s1.forEachRemaining(System.out::println);
    

    输出:

    Banana
    Orange
    -- traversing the other half of the spliterator ---
    Apple
    

    理想的Trysplit方法应该将其元素精确地分成两半,从而允许平衡的并行计算。

    分裂过程也被称为“划分”或“分解”。