JDK8-Stream流库详解

流提供了一种让我们可以在比集合更高的概念级别上指定计算的数据视图。通过使用流,我们可以说明想要完成什么任务,而不是说明如何去实现它。

流的创建

  • Collection.stream():从一个集合生成流
  • Collection.parallelStream():从一个集合生成并行流
  • Stream::of(T... t):从一个或多个元素中生成流
  • Arrays::stream(T[] array, int startInclusive, int endExclusive):从数组中生成流
  • Stream::empty():生成一个空的流
String str = "1,2,3,4,5,6,7";
Stream<String> wordStream1 = Stream.of(words);
//等效于
Stream<String> wordStream2 = Arrays.stream(words, 0, words.length);

无限流

  1. Stream::generate(Supplier<T> s),通过supplier的get获取流下一个要生成的元素。
Stream<String> echos = Stream.generate(() -> "Echo");
Stream<Double> randoms = Stream.generate(Math::random);
  1. Stream::iterate(final T seed, final UnaryOperator<T> f),接受一个种子值和一个一元函数,从种子值开始反复将函数应用到之前的结果上。
Stream<BigInteger> integers 
    = Stream.iterate(BigInteger.ZERO,n->n.add(BigInteger.ONE));

流的修改

流的操作不会修改其数据源,当我们想修改流中的数据时,只能通过一些方法获取一个中间流。

过滤

Stream<T> filter(Predicate<? super T> predicate)

用于过滤掉一些数据,只保留predicate.test()返回为true的数据。

Stream<Integer> nums = Stream.of(1,2,3,4,5,6,7);
Stream<Integer> modNums = nums.filter(i -> i > 4); //5,6,7

转换

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

当我们想按照某种方式转换流中的的值可以使用map并传递执行该转换的函数。

Stream<Integer> nums = Stream.of(1,2,3,4,5,6,7);
Stream<Integer> modNums = nums.map(i -> i + 3); //4,5,6,7,8,9,10

其他操作

  • Stream<T> limit(long maxSize):截取最大maxSize个元素,组成新流。
  • Stream<T> skip(long n):丢弃前n个元素,组成新流。
  • public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b):产生一个流,它的元素是a的元素后面跟了b的元素。
  • Stream<T> distinct():去除重复操作
  • Stream<T> sorted()Stream<T> sorted(Comparator<? super T> comparator):返回一个排序后的流。
  • Stream<T> peek(Consumer<? super T> action):当实际访问一个元素时,会把函数应用到这个元素。(仅当访问时,因为流的操作是懒惰的)

流的约简

约简是一种终结操作,它们会将流约简为可以在程序中使用的非流值。

  • long count(); :返回流中元素的数量
  • Optional<T> max(Comparator<? super T> comparator);:返回最大值
  • Optional<T> min(Comparator<? super T> comparator);:返回最小值
  • Optional<T> findFirst();:返回第一个值,搭配filter使用有奇效
  • Optional<T> findAny();:返回任意一个值,适用于并行处理流
  • boolean anyMatch(Predicate<? super T> predicate);:是否存在匹配
  • boolean allMatch(Predicate<? super T> predicate);:是否全部匹配
  • boolean noneMatch(Predicate<? super T> predicate);:是否不存在匹配

需要注意的是部分方法返回的是一个Optional<T>类型的返回值,它要么在其中包装了答案,要么表示没有任何值(因为流碰巧为空)。

Optional有如下主要方法:

public boolean isPresent();//检查值是否存在
public T get();//如果有值返回值,没有抛出异常
public T orElse(T other);//如果有值返回值,没有值返回给定的参数

收集结果

  • 调用iterator()返回一个旧式风格的迭代器
  • 使用forEach()方法传入一个一元操作方法。
  • toArray()返回一个Object数组
  • <R, A> R collect(Collector<? super T, A, R> collector);传入一个collector,返回集合,常用的有Collectors.toList()Collectors.toSet()
    或者Collectors.toCollection()里面传入具体集合的构造器方法

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/jdk8-stream%e6%b5%81%e5%ba%93%e8%af%a6%e8%a7%a3/

(0)
彭晨涛彭晨涛管理者
上一篇 2020年2月11日
下一篇 2020年2月12日

相关推荐

  • AQS及其应用ReentrantLock源码分析

    AQS原理 概述 全称是 AbstractQueuedSynchronizer(抽象同步队列),是阻塞式锁和相关的同步器工具的框架。 特点:+ 用 state 属性来表示资源的状态…

    2020年2月4日
    0120
  • LinkedList源码分析

    相关文章:ArrayList源码分析 List家族一览: LinkedList简介 LinkedList的超类有List、Queue,说明它既有List的性质也有Queue的性质,…

    2019年12月2日
    080
  • 详解Java中的四种引用及其应用

    本文参考资源: 深入理解Java中的引用(一)——Reference - 简书 深入理解Java中的引用(二)——强软弱虚引用 - 简书 深入理解Java中的引用(三)——Dire…

    2020年2月14日
    0190
  • JDK8新增高效原子累加器LongAdder源码分析

    很久以前写过CAS应用之JUC下的原子类,但是LongAdder这个类没有去看,只是给了一个其他博客的参考链接。今天就自己来分析一下。 AtomicLong的问题和LongAdde…

    2020年5月19日
    0740
  • Java基础查缺补漏04

    继续我的复习刷题 接口方法可以使用abstract修饰 问题: java接口的方法修饰符可以为?(忽略内部接口) A. privateB. protectedC. finalD. …

    Java 2020年5月28日
    0200
  • try-catch-finally字节码实例探究

    本文使用Idea的jclasslib插件查看字节码。本文全程自言自语,请勿自行代入。 概述 java是怎么处理try-catch-finally的? 我们在深入理解java虚拟机第…

    2020年4月8日
    0720
  • 网络编程之AIO

    AIO介绍 AIO是JDK1.7引入的,也称为NIO 2.0 NIO的同步非阻塞类似于轮询,让Selector去询问各个通道的状态。 而AIO则是通过Future实现真正的异步,让…

    Java 2020年2月8日
    0280
  • 阻塞队列BlockingQueue详解

    阻塞队列是生产者消费者模式的经典体现。 我们在曾在Java线程池详解中自己实现过一个阻塞队列,这篇文章我们来研究一下JDK中的阻塞队列: BlockingQueue接口主要方法 抛…

    Java 2020年2月14日
    0580
  • 深入理解java虚拟机第三版读书笔记01

    做笔记之前的感言 谈到《深入理解java虚拟机》,在业内可太有名了,是国内的一位大神写的一本关于java虚拟机的畅销书,基本上对java稍有深入的程序员都听说过这本书。不过遗憾的是…

    2020年1月4日
    0280
  • Java中SPI机制介绍和源码分析

    本文参考资源: 高级开发必须理解的Java中SPI机制 - 简书 什么是SPI SPI全称为Service Provider Interface,是一种服务发现机制。SPI 的本质…

    Java 2020年3月19日
    0700

发表回复

登录后才能评论