• 流API--流的迭代


    虽然流不是数据存储对象,但是仍然可以使用迭代器来遍历其元素,就如同使用迭代器遍历集合中的元素一样。
    流API支持2类迭代器,一类是传统的Iterator,另一类是JDK8新增的Spliterator。

    • 对流使用传统的迭代器
    要获得流的迭代器,在流上调用interator()方法,然后调用hasNext()方法和next()方法即可。代码如下:
    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
  • 相关阅读:
    CPP(c++) google gflags
    CPP(c++) google gtest
    CPP(c++) google gmock
    CPP(c++) google glog
    CPP(c++) lambda
    CPP(c++) 多线程
    可以使退出终端后仍运行的命令行
    python下输出指定年月日的方法之一
    linux下时间相差8小时的问题
    C# 中结束阻塞模式的接收方法
  • 原文地址:https://www.cnblogs.com/LinkinPark/p/5232961.html
Copyright © 2020-2023  润新知