day013-流

Posted gzyzhui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day013-流相关的知识,希望对你有一定的参考价值。

1、 常用函数式接口

1.1 Predicate接口

有时候我们需要对某种的数据进行判断,从而得到一个boolean值结果。这时可以使用java.util.function.Predicate<T>接口。

1.1.1 常见方法

抽象方法:test()          用于条件判断的场景

默认方法:and()   将两个Predicate条件使用“与”逻辑连起来实现“并且”的效果

默认方法:or()      将两个Predicate条件使用“或”逻辑连起来实现“或”的效果

默认方法:negate()    实现取反的效果

 

1.2 Function接口

Java.util.function.Function<T, R>接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件。有进有出,所以称为“函数Function”。

1.2.1 常见方法

抽象方法: R apply(T t)     根据类型T的参数获取类型R的结果。

默认方法: <V> Function<T,V> andThen?(Function<? super R,? extends V> after)

有前后执行的关系。先执行的结果,作为后执行的参数

1.2.2延迟方法和终结方法

延迟方法:只是在拼接Lambda函数模型的方法,并不立即执行得到结果。

终结方法:根据拼接好的Lambda函数模型,立即执行得到结果值的方法。

下面的表格进行了方法分类的整理:

接口名称

方法名称

抽象/默认

延迟/终结

Supplier

get

抽象

终结

Consumer

accept

抽象

终结

 

andThen

默认

延迟

Predicate

test

抽象

终结

 

and

默认

延迟

 

or

默认

延迟

 

negate

默认

延迟

Function

apply

抽象

终结

 

andThen

默认

延迟

 

2.Stream

在Java8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊端。

注意:请暂时忘记对传统IO流的固有印象。

整体来看,流式思想类似于工厂车间的“生产流水线”。

 

这张图中展示了过滤、映射、跳过、计数等多部操作,这是一种集合元素的处理方案,而方案就是一种“函数模型”。图中的每一个方框都是一个“流”,调用指定的方案,可以从一个流模型转化为另一个流模型。

备注:“Stream流”其实是一个集合元素的函数模型,它并不是集合,也不是数据结构,其本身并不存储任何元素(或其地址值)。

 

 

2.1 创建流

单列流可以直接调用stream()方法获取

数组可以用Stream.of() 方法获取

2.2 常用方法

(a) filter:过滤

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

该接口接受一个Predicate函数式接口参数(可以是一个Lambda或方法引用)作为筛选条件。

(b) boolean test(T t);

(c) count:计数,返回流中元素的个数

(d) limit:获取前几个

(e) skip:跳过前几个

(f) map:映射

(e) concat:拼接。一般相同类型的流,才进行拼接。

 

2.3 非终结方法与终结方法

凡是返回值仍然为Stream接口的非终结方法(函数拼接方法),它们支持链式调用。而返回值不再为Stream接口的为终结方法,不再支持链式调用。

方法名

方法作用

方法种类

是否支持链式调用

count

统计个数

终结

forEach

逐一处理

终结

filter

过滤

函数拼接

limit

取用前几个

函数拼接

skip

跳过前几个

函数拼接

map

映射

函数拼接

concat

组合

函数拼接

 

2.4收集Stream结果

2.4.1收集到集合中

Stream.collect(Collectors.toList())         //收集流中元素到List集合中

Stream.collect(Collectors.toSet())         //收集流中元素到Set集合中

Stream.toArray(String[]::new)         //收集流中元素到数组中

2.5 并发流

串行流:在一个线程中从上往下执行

并行流:可以同时在多个线程中执行。可以使用多线程,执行并发操作。

2.5.1并发流的获取方式

方式1:将串行流转化为并发流               .调用串行流的parallel()方法

方式2: 直接获得并发流                调用集合对象的parallelStream()的方法

 

以上是关于day013-流的主要内容,如果未能解决你的问题,请参考以下文章

Day013 instanceof和类型转换

DAY 013--set(增删改查关系)

Day013 Static关键字详解

GIS-013-Cesium Terrain 数据生成

Python3-笔记-E-013-库-Python的时间函数总结

013- Kafka应用之Kafka与Spark Streaming整合