当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Java Iterator和Spliterator的区别用法及代码示例


Java Iterator 接口表示一个能够迭代 Java 对象集合的对象,一次一个对象。 Iterator 接口是 Java 中用于迭代对象集合的最古老的机制之一(尽管不是最古老的——Enumerator 早于 Iterator)。

此外,迭代器与枚举有两点不同:

1. 迭代器允许调用者在元素迭代期间从指定集合中删除给定元素。

2. 方法名称得到增强。

Java


// Java program to illustrate Iterator interface 
  
import java.util.Iterator; 
import java.util.LinkedList; 
import java.util.List; 
public class JavaIteratorExample1 { 
    public static void main(String[] args) 
    { 
  
        // create a linkedlist 
        List<String> list = new LinkedList<>(); 
  
        // Add elements 
        list.add("Welcome"); 
        list.add("to"); 
        list.add("our"); 
        list.add("website"); 
  
        // print the list to the console 
        System.out.println("The list is given as : "
                           + list); 
  
        // call iterator on the list 
        Iterator<String> itr = list.iterator(); 
  
        // itr.hasNext() returns true if there 
        // is still an element next to the current 
        // element pointed by iterator 
        while (itr.hasNext()) { 
  
            // Returns the next element. 
            System.out.println(itr.next()); 
        } 
  
        // Removes the last element. 
        itr.remove(); 
  
        // print the list after removing an 
        // element 
        System.out.println( 
            "After the remove() method is called : "
            + list); 
    } 
}
输出
The list is given as : [Welcome, to, our, website]
Welcome
to
our
website
After the remove() method is called : [Welcome, to, our]

就像迭代器ListIterator,分离器 是一个 Java 迭代器,用于从 List 实现的对象中迭代元素 one-by-one。

Spliterator的主要函数有:

  • 拆分源数据
  • 处理源数据

JDK 8 中包含 Interface Spliterator,用于利用顺序遍历之外的并行性优势。它被设计为迭代器的并行模拟。

Java


// Java program to illustrate a Spliterator 
  
import java.util.*; 
import java.util.stream.Stream; 
  
public class InterfaceSpliteratorExample { 
  
    public static void main(String args[]) 
    { 
  
        // Create an object of array list 
        ArrayList<Integer> list = new ArrayList<>(); 
  
        // Add elements to the array list 
        list.add(101); 
        list.add(201); 
        list.add(301); 
        list.add(401); 
        list.add(501); 
  
        // create a stream on the list 
        Stream<Integer> str = list.stream(); 
  
        // Get Spliterator object on stream 
        Spliterator<Integer> splitr = str.spliterator(); 
  
        // Get size of the list 
        // encountered by the 
        // forEachRemaining method 
        System.out.println("Estimate size: "
                           + splitr.estimateSize()); 
  
        // Print getExactSizeIfKnown 
        // returns exact size if finite 
        // or return -1 
        System.out.println("Exact size: "
                           + splitr.getExactSizeIfKnown()); 
  
        // Check if the Spliterator has all 
        // the characteristics 
        System.out.println("Boolean Result: "
                           + splitr.hasCharacteristics( 
                                 splitr.characteristics())); 
  
        System.out.println("Elements of ArrayList :"); 
  
        // print elements using forEachRemaining 
        splitr.forEachRemaining( 
            (n) -> System.out.println(n)); 
  
        // Obtaining another Stream to the array list. 
        Stream<Integer> str1 = list.stream(); 
  
        splitr = str1.spliterator(); 
  
        // Obtain spliterator using     trySplit() method 
        Spliterator<Integer> splitr2 = splitr.trySplit(); 
  
        // If splitr can be partitioned use splitr2 first. 
        if (splitr2 != null) { 
  
            System.out.println("Output from splitr2: "); 
            splitr2.forEachRemaining( 
                (n) -> System.out.println(n)); 
        } 
  
        // Now, use the splitr 
        System.out.println("Output from splitr1: "); 
        splitr.forEachRemaining( 
            (n) -> System.out.println(n)); 
    } 
}
输出
Estimate size: 5
Exact size: 5
Boolean Result: true
Elements of ArrayList :
101
201
301
401
501
Output from splitr2: 
101
201
Output from splitr1: 
301
401
501

java中Iterator和Spliterator的区别:

迭代器

Spliterator

Java 1.2 中引入 Java 1.8 中引入
迭代器仅单独迭代元素 Spliterator 可以单独或批量遍历元素
它是整个集合 API 的迭代器 它是 Collection 和 Stream API 的迭代器,Map 实现类除外
它使用外部迭代 它使用内部迭代。
它是一个通用迭代器 它不是通用迭代器
不支持并行编程 它通过分割给定的元素集来支持并行编程,以便每个集合都可以单独处理。


相关用法


注:本文由纯净天空筛选整理自gargmikku941大神的英文原创作品 Difference Between Iterator and Spliterator in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。