跟我学 Java 8 新特性之 Stream 流(二)关键知识点

转载自   跟我学 Java 8 新特性之 Stream 流(二)关键知识点

我们的第一篇文章,主要是通过一个Demo,让大家体验了一下使用流API的那种酣畅淋漓的感觉。如果你没有实践,我还是再次呼吁你动手敲一敲,自己实实在跑一遍上一篇的Demo。

相信你的感受和理解也会随之加深的。继续探索流API的高级功能之前,我们先从接口级别全面了解一下流API,这个对于我们来说是至关重要的。接下来,我给大家准备了一张流API关键知识点的UML图。但是大家只需要花一两分钟,整理看一下就可以了,不需要记住,先有个印象,后面我给大家讲解一些关键的方法:

流API UML

我先整体介绍一下:流API定义的几个接口,都是在java.util.stream包中的.其中上图中的BaseStream接口是最基础的接口,它提供了所有流都可以使用的基本功能:

public interface BaseStream<T, S extends BaseStream<T, S>> extends AutoCloseable {//....先忽略这些具体的细节}

由这个接口的定义我们得知,BaseStream是一个泛型接口,它有两个类型参数T和S, 其中T指定了流中的元素的类型,并且由 <S extends BaseStream<T,S>>可以知道S必须为BaseStream或BaseStream子类(换句话说,就是S必须是扩展自BaseStream的)。BaseStream继承了AutoCloseable接口。

这个接口主要是简化了关闭资源的操作。但是像平时我们操作的集合或数组,基本上都不会出现关闭流的情况。

//由BaseStream接口派生出的流接口包括IntStream ,LongStream,DoubleStream ,Stream<T>
public interface IntStream extends BaseStream<Integer, IntStream> {}
public interface LongStream extends BaseStream<Long, LongStream> {
}public interface DoubleStream extends BaseStream<Double, DoubleStream> {}//这是最具代表性的接口
public interface Stream<T> extends BaseStream<T, Stream<T>> {
//....先忽略这些具体的细节
}

由于Stream接口是最具代表性的,所以我们就选择它来讲解,其实在我们学完Stream接口,其它的三个接口,在使用上基本是一致的了,我们上一篇的Demo基本上也是使用Stream接口来做的练习。

我们回想一下:在上一个Demo中我们通过集合框架的stream()方法,就能返回一个流了,它的返回类型就是Stream,比如我们Stream,由此得知,Stream接口里的类型参数T就是流中的元素的类型。木有错,就是这样滴。到这里,整个系列你们已经全部学会了,下课。

 

战斗才刚刚开始!

 

现在是时候开始记忆一些知识了.

BaseStream详解:

public interface BaseStream<T, S extends BaseStream<T, S>> extends AutoCloseable {Iterator<T> iterator();//line2Spliterator<T> spliterator();//line3boolean isParallel();//line4S sequential();//line5S parallel();//line6S unordered();//line7S onClose(Runnable closeHandler);//line8@Overridevoid close();//line10}
  • Iterator iterator(); //line2 获得流的迭代器,并返回对该迭代器的引用(终端操作)

  • Spliterator spliterator(); //line3 获取流的spliterator,并返回其引用(终端操作)

  • boolean isParallel(); //line4 如果调用流是一个并行流,则返回true;如果调用流是一个顺序流,则返回false。

  • S sequential(); //line5 基于调用流,返回一个顺序流。如果调用流已经是顺序流了,就返回该流。(中间操作)

  • S parallel(); //line6 基于调用流,返回一个并行流。如果调用流已经是并行流了,就返回该流。(中间操作)

  • S unordered(); //line7 基于调用流,返回一个无序流。如果调用流已经是无序流了,就返回该流。(中间操作)

  • S onClose(Runnable closeHandler); //line8 返回一个新流,closeHandler指定了该流的关闭处理程序,当关闭该流时,将调用这个处理程序。(中间操作)

  • void close(); //line10 从AutoCloseable继承来的,调用注册关闭处理程序,关闭调用流(很少会被使用到)

"终端操作"&"中间操作"

细心的同学应该注意到了,BaseStream接口里面的很多方法都在最后标识了(终端操作)和(中间操作),它们之间的区别是非常重要的。

  • 终端操作 会消费流,这种操作会产生一个结果的,比如上面的 iterator()和 spliterator(),以及上一篇中提到的min()和max(),或者是执行某一种操作,比如上一篇的forEach(),如果一个流被消费过了,那它就不能被重用的。

  • 中间操作 中间操作会产生另一个流。因此中间操作可以用来创建执行一系列动作的管道。一个特别需要注意的点是:中间操作不是立即发生的。相反,当在中间操作创建的新流上执行完终端操作后,中间操作指定的操作才会发生。所以中间操作是延迟发生的,中间操作的延迟行为主要是让流API能够更加高效地执行。

"中间操作"的状态

流的中间操作,可以为分 无状态操作有状态操作两种,在无状态操作中,在处理流中的元素时,会对当前的元素进行单独处理。比如:谓词过滤操作,因为每个元素都是被单独进行处理的,所有它和流中的其它元素无关,因此被称为无状态操作;而在有状态操作中,某个元素的处理可能依赖于其他元素。比如查找最小值,最大值,和排序,因为他们都依赖于其他的元素。因此为称为有状态操作。 

当需要进行并行处理流时,有状态的操作和无状态的区别是非常重要的,因为有状态操作可能需要几次处理才能完成,后面的文章我将会给大家详细地讲,现在只需要正常学习下去就可以了

另外,指出一点,如果大家了解泛型的话,应该知道,泛型的类型参数只能是引用类型,因此Stream操作的对象只能是引用类型的,不能用于基本类型。当然官方早已考虑到这一点了,前面你们看到的IntStream,LongStream,DoubleStream就是官方给我们提供的处理基本类型的流了。此处是不是应该给他们掌声!

Stream详解

在有了前面的那些知识作铺垫之后,学Stream接口应该会顺风顺水了。还是先看看Stream的详情先:

public interface Stream<T> extends BaseStream<T, Stream<T>> {Stream<T> filter(Predicate<? super T> predicate);//line2<R> Stream<R> map(Function<? super T, ? extends R> mapper);//line3IntStream mapToInt(ToIntFunction<? super T> mapper);//line4LongStream mapToLong(ToLongFunction<? super T> mapper);DoubleStream mapToDouble(ToDoubleFunction<? super T> mapper);<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper);LongStream flatMapToLong(Function<? super T, ? extends LongStream> mapper);DoubleStream flatMapToDouble(Function<? super T, ? extends DoubleStream> mapper);Stream<T> distinct();Stream<T> sorted();//line12Stream<T> sorted(Comparator<? super T> comparator);//line13Stream<T> peek(Consumer<? super T> action);Stream<T> limit(long maxSize);Stream<T> skip(long n);void forEach(Consumer<? super T> action);//line17void forEachOrdered(Consumer<? super T> action);//line18Object[] toArray();<A> A[] toArray(IntFunction<A[]> generator);T reduce(T identity, BinaryOperator<T> accumulator);Optional<T> reduce(BinaryOperator<T> accumulator);<U> U reduce(U identity,BiFunction<U, ? super T, U> accumulator,BinaryOperator<U> combiner);<R> R collect(Supplier<R> supplier,BiConsumer<R, ? super T> accumulator,BiConsumer<R, R> combiner);<R, A> R collect(Collector<? super T, A, R> collector);Optional<T> min(Comparator<? super T> comparator);//line30Optional<T> max(Comparator<? super T> comparator);//line31long count();boolean anyMatch(Predicate<? super T> predicate);boolean allMatch(Predicate<? super T> predicate);boolean noneMatch(Predicate<? super T> predicate);Optional<T> findFirst();Optional<T> findAny();// Static factoriespublic static<T> Builder<T> builder() {return new Streams.StreamBuilderImpl<>()}public static<T> Stream<T> empty() {return StreamSupport.stream(Spliterators.<T>emptySpliterator(), false);}public static<T> Stream<T> of(T t) {return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);}@SafeVarargs@SuppressWarnings("varargs") // Creating a stream from an array is safepublic static<T> Stream<T> of(T... values) {return Arrays.stream(values);}public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f) {Objects.requireNonNull(f);final Iterator<T> iterator = new Iterator<T>() {@SuppressWarnings("unchecked")T t = (T) Streams.NONE;@Overridepublic boolean hasNext() {return true;}@Overridepublic T next() {return t = (t == Streams.NONE) ? seed : f.apply(t);}};return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED | Spliterator.IMMUTABLE), false);}public static<T> Stream<T> generate(Supplier<T> s) {Objects.requireNonNull(s);return StreamSupport.stream(new StreamSpliterators.InfiniteSupplyingSpliterator.OfRef<>(Long.MAX_VALUE, s), false);}public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b) {Objects.requireNonNull(a);Objects.requireNonNull(b);@SuppressWarnings("unchecked")Spliterator<T> split = new Streams.ConcatSpliterator.OfRef<>((Spliterator<T>) a.spliterator(), (Spliterator<T>) b.spliterator());Stream<T> stream = StreamSupport.stream(split, a.isParallel() || b.isParallel());return stream.onClose(Streams.composedClose(a, b));}
}
  • Stream filter(Predicate predicate); //line2 产生一个新流,其中包含调用流中满足predicate指定的谓词元素(中间操作)

  • Stream map(Function mapper); //line3 产生一个新流,对调用流中的元素应用mapper,新流中包含这些元素。(中间操作)

  • IntStream mapToInt(ToIntFunction mapper); //line4 对调用流中元素应用mapper,产生包含这些元素的一个新IntStream流。(中间操作)

  • Stream sorted(); //line12

  • Stream sorted(Comparator comparator); //line13` 产生一个自然顺序排序或者指定排序条件的新流(中间操作)

  • void forEach(Consumer action); //line17

  • void forEachOrdered(Consumer action); //line18 遍历了流中的元素(终端操作)

  • Optional min(Comparator comparator) //line30

  • Optional max(Comparator comparator); //line31 获得流中最大最小值,比较器可以由自己定义,也可以使用JDK提供的(终端操作)

小结一下

这一篇主要是介绍了流API的一些关键方法,和一些关键的概念,虽然稍微枯燥了一点,但是,不能否认,全面地学习流API,会让你对流API的认识会更加的深刻,所以如果时间允许,请再认真读读这一篇文章吧,当然,也可以在实践中慢慢认识它们,但是,对于这些基本概念的知识,你越早掌握,对你的益处是更加大的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Build 2017 | 微软开发者大会临近,今年的主题是边缘计算

200 多家明星企业&#xff0c;20 位著名投资机构顶级投资人共同参与&#xff01;「新智造成长榜」致力于发掘 AI 领域有 “三年十倍” 成长潜力的创新公司&#xff0c;下一波 AI 独角兽&#xff0c;会有你么&#xff1f;点击加入&#xff01; 雷锋网按&#xff1a;微软首席执行…

王者齐聚!Unite 2017 Shanghai 日程讲师全揭晓

汇聚了来自全球的 Unity开发者、发行商、培训家及爱好者的 Unite 2017 Shanghai 即将于于 5 月 11 日&#xff0d;13日在上海国际会议中心隆重举行。Unite 大会是由 Unity 举办的全球开发者大会&#xff0c;至今已有 10 年历史&#xff0c;并已成为游戏行业、VR/AR 行业最具权威…

批评?惩罚?

批评&#xff1f;惩罚&#xff1f;最近一直在听王晓春老师的《做一个专业的班主任》&#xff0c;并且上次在校内分享教学经验和技巧的时候&#xff0c;也推荐给其他的老师看了。我一般都是在上班的路上听&#xff0c;王老师的很多观点确实值得我们深思&#xff0c;但是&#xf…

屌炸天,Oracle 发布了一个全栈虚拟机 GraalVM,支持 Python

转载自 屌炸天&#xff0c;Oracle 发布了一个全栈虚拟机 GraalVM&#xff0c;支持 Python 前阵子&#xff0c;Oracle 发布了一个黑科技 "GraalVM"&#xff0c;号称是一个全新的通用全栈虚拟机&#xff0c;并具有高性能、跨语言交互等逆天特性&#xff0c;真有这么…

就业形势如此的严峻,你为何不努力?

就业形势如此的严峻&#xff0c;你们有何理由不努力&#xff1f;今天&#xff0c;围绕就业的问题展开个话题吧。马上&#xff0c;18级1班就要出去就业了&#xff0c;以前带的17级3班三期的时候学生的状态都比较积极&#xff0c;自己知道自己的实力&#xff0c;我和就业老师、班…

涨姿势,图文带你了解 8 大排序算法

转载自 涨姿势&#xff0c;图文带你了解 8 大排序算法 排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存。 常见…

React中分页错误

因为save是异步方法 直接从model中取最新的数据

班级第一次问卷调查

135编辑器调差问卷终于&#xff0c;在班内做了一次问卷调查了&#xff0c;这是自同学们入学以来做的第一次调查&#xff0c;主要是从学生的对所学课程、班主任以及教员老师的角度出发的&#xff0c;所有的调查均采取匿名方式&#xff0c;以保证调查的民主性&#xff1a;调查的问…

OAuth 2.0: Bearer Token Usage

Bearer Token (RFC 6750) 用于OAuth 2.0授权访问资源&#xff0c;任何Bearer持有者都可以无差别地用它来访问相关的资源&#xff0c;而无需证明持有加密key。一个Bearer代表授权范围、有效期&#xff0c;以及其他授权事项&#xff1b;一个Bearer在存储和传输过程中应当防止泄露…

Spring Boot 核心配置文件详解

转载自 Spring Boot 核心配置文件详解 用过 Spring Boot 的都知道在 Spring Boot 中有以下两种配置文件 bootstrap (.yml 或者 .properties) application (.yml 或者 .properties) 为什么会有这两种配置文件呢&#xff1f;大家都清楚它们的区别和具体使用场景吗&#xff1…

Net分布式系统之:微服务架构

一、背景&问题 之前框架是一个基于SOA思想设计的分布式框架。各应用通过服务方式提供使用&#xff0c;服务之间通信是RPC方式调用&#xff0c;具体实现基于.NET的WCF通信平台。框架存在如下2个问题&#xff1a; 1、高并发处理能力不足。一当高并发请求&#xff0c;可能出现…

[Cake] 0.C#Make自动化构建-简介

0. Cake是什么&#xff1f; Cake是C# Make的缩写&#xff0c;是一个基于C# DSL的自动化构建系统。它可以用来编译代码&#xff0c;复制文件以及文件夹&#xff0c;运行单元测试&#xff0c;压缩文件以及构建Nuget包等等。 熟悉大名鼎鼎的Make的小伙伴&#xff0c;应该已经知道…

99%的面试官都会问到的Java面试题

转载自 99%的面试官都会问到的Java面试题 最近是招聘季&#xff0c;所谓金九银十&#xff0c;正是跳槽的好几节。今天&#xff0c;给大家整理了一些Java面试常考的经典题目&#xff0c;我们一道一道来分析一下。 经典面试题 1、谈谈你对 Java 平台的理解&#xff1f;“Java …

想对你们每个人说的话

135编辑器1吉方鑫&#xff1a;方鑫&#xff0c;在我和王老师面前&#xff0c;你永远都是那么的乖&#xff0c;爱笑&#xff0c;常言道&#xff1a;爱笑的人运气不会太差&#xff0c;希望你也是如此哦&#xff0c;现在的学业已经到了三期了&#xff0c;相信你也知道后期的学习该…

Dora.Interception: 一个为.NET Core度身定制的AOP框架

多年从事框架设计开发使我有了一种强迫症&#xff0c;那就是见不得一个应用里频繁地出现重复的代码。之前经常Review别人的代码&#xff0c;一看到这样的程序&#xff0c;我就会想如何将这些重复的代码写在一个地方&#xff0c;然后采用“注入”的方式将它们放到需要的程序中。…

揭秘阿里秒级百万TPS平台架构实现

转载自 揭秘阿里秒级百万TPS平台架构实现 导读&#xff1a;搜索离线数据处理是一个典型的海量数据批次/实时计算结合的场景&#xff0c;阿里搜索中台团队立足内部技术结合开源大数据存储和计算系统&#xff0c;针对自身业务和技术特点构建了搜索离线平台&#xff0c;提供复杂…

相对你们说的一些话

135编辑器1田文豪&#xff1a;文豪&#xff0c;最近上课我看你很认真&#xff0c;面试题也背的挺好的&#xff0c;你在很努力的学习了&#xff0c;这是一个非常好的趋势&#xff0c;希望你能一直保持下去。你的脑字也是很灵活的&#xff0c;好几次考试都超出了我的预想&#xf…

Build 2017 | 一文看懂微软 Build 2017 大会:让 AI 走向边缘

200 多家明星企业&#xff0c;20 位著名投资机构顶级投资人共同参与&#xff01;「新智造成长榜」致力于发掘 AI 领域有 “三年十倍” 成长潜力的创新公司&#xff0c;下一波 AI 独角兽&#xff0c;会有你么&#xff1f;点击阅读原文了解详情&#xff01; 雷锋网按&#xff1a;…

一文带你理解Java中Lock的实现原理

转载自 一文带你理解Java中Lock的实现原理 当多个线程需要访问某个公共资源的时候&#xff0c;我们知道需要通过加锁来保证资源的访问不会出问题。java提供了两种方式来加锁&#xff0c;一种是关键字&#xff1a;synchronized&#xff0c;一种是concurrent包下的lock锁。syn…

请19级的童鞋们接收一下

135编辑器1李磊&#xff1a;磊&#xff0c;假期过的可好&#xff1f;有没有人在写作业呀&#xff1f;通过这段时间的学习&#xff0c;可以看得出你对我们的课程兴趣浓厚&#xff0c;尤其是scratch&#xff0c;自己做了好多的案例&#xff0c;之前还以为你们都是从网上直接下载的…