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-流的主要内容,如果未能解决你的问题,请参考以下文章