流API支持2类迭代器,一类是传统的Iterator,另一类是JDK8新增的Spliterator。
- 对流使用传统的迭代器
public static void main(String[] args) throws Exception { List<Double> list = new ArrayList<>(4); list.add(1.1); list.add(2.5); list.add(3.0); list.add(4.8); Iterator<Double> iterator = list.parallelStream().iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } }
- 使用spliterator
public static void main(String[] args) throws Exception { List<Double> list = new ArrayList<>(4); list.add(1.1); list.add(2.5); list.add(3.0); list.add(4.8); System.out.println("----研究下tryAdvance+forEachRemaining的用法----"); Spliterator<Double> spliterator = list.parallelStream().spliterator(); //while (spliterator.tryAdvance(System.out::println)); //tryAdvance方法是hasNext()和next()方法的结合体 while (spliterator.tryAdvance(System.out::println)) { System.out.println("下面显示流中剩余的字符串"); //将各个元素作为一个整体来应用操作 spliterator.forEachRemaining(System.out::println); } System.out.println("------现在来研究下trySplit的拆分----------"); List<Double> list1 = new ArrayList<>(4); list1.add(1.1); list1.add(2.5); list1.add(3.0); list1.add(4.8); Spliterator<Double> spliterator1 = list1.parallelStream().spliterator(); //trySplit返回对拆分后的一部分的引用 Spliterator<Double> trySplit1 = spliterator1.trySplit(); if (Objects.nonNull(trySplit1)) { //访问新的生成的迭代器的一部分元素 trySplit1.forEachRemaining(System.out::println); } System.out.println("====访问原来的流中剩下的一部分元素======="); spliterator1.forEachRemaining(System.out::println); }
关于这几个方法,我们来看下几个重要的API好了:
tryAdvance(Consumer<? super T> action) :对流中的元素进行迭代,只要该方法返回true,就会对下一个元素执行操作,如果该方法返回false,迭代就完成了。可以理解成为interator接口中hasNext和next方法的合并体,而且还提供了迭代性能。
forEachRemaining(Consumer<? super T> action) :将各个元素作为一个整体来应用操作,并不是一次处理一个元素。注意,使用这个方法,不需要提供一个循环来一次处理一个元素。具体看下面的代码:
public static void main(String[] args) throws Exception { List<Double> list = new ArrayList<>(4); list.add(1.1); list.add(2.5); list.add(3.0); list.add(4.8); list.parallelStream().spliterator().forEachRemaining(System.out::println); System.out.println("这2种效果一样的。。。"); List<Double> list1 = new ArrayList<>(4); list1.add(1.1); list1.add(2.5); list1.add(3.0); list1.add(4.8); Spliterator<Double> spliterator = list1.parallelStream().spliterator(); while (spliterator.tryAdvance(System.out::println)); }
trySplit() :它将被迭代的元素划分成2部分,返回其中一部分的Spliterator,另一部分通过原来的Spliterator访问。如果无法拆分调用Spliterator,返回null