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-流的更多相关文章
- java - day013 - 流, FileInputStream, BufferedInputStream,
流 Stream 把数据的读写,抽象成数据在管道中流动. 流是单向的 输入流, 只能用来读取数据 输出流, 只能用来输出数据 流只能顺序读写数据 流只能一次性从头到尾读写数据 流动过的数据,不能反复流 ...
- 使用C#处理基于比特流的数据
使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
- FILE文件流的中fopen、fread、fseek、fclose的使用
FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
- java 字节流与字符流的区别
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...
- BZOJ 3504: [Cqoi2014]危桥 [最大流]
3504: [Cqoi2014]危桥 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1407 Solved: 703[Submit][Status] ...
- java I/O流
输入流(读取数据的流) BufferedInputStream---继承--->FileInputStream--继承--->InputStream------> (1)字节流操作中 ...
- Ford-Fulkerson 最大流算法
流网络(Flow Networks)指的是一个有向图 G = (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0.如果 (u, v) ∉ E 则可以规定 c(u, ...
- .NET基础拾遗(3)字符串、集合和流
Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...
随机推荐
- UVALive - 7061 区间DP初步
题意:杀一只狼i会收到a[i]+b[i当前左边]+b[i当前右边]的攻击,求杀死所有狼的最小代价 #include<iostream> #include<algorithm> ...
- 给json格式化的一个小工具
var glob = require("glob") // options is optional var fs=require("fs") glob(&quo ...
- webgoat环境搭建
链接: https://pan.baidu.com/s/1gfEKIyB 密码: 5zdq 1:配置Java环境变量,过程请找度娘 2:解压下载好的tomcat 3:将webgoat-containe ...
- (转)博弈 SG函数
此文为以下博客做的摘要: https://blog.csdn.net/strangedbly/article/details/51137432 ---------------------------- ...
- VUE 入门教程
http://www.runoob.com/w3cnote/vue-js-quickstart.html VUE安装教程 https://segmentfault.com/a/119000001218 ...
- Git merge 和 rebase 进一步比较
但是 假如 我不想看到 分支转折点呢 合并的分支始终会存在一个交叉点 Microsoft Windows [版本 10.0.17134.345] (c) Microsoft Corporation.保 ...
- java判断jsonObject和jsonArray是否为空
resJsonObj = {"res":"0","msg":"","data":{"Nam ...
- 使用Verilog描述RTL图
题目要求 分别用两种方式表达此电路: 1)在一个模块中用两个过程来表达: 2)用顶层文件和例化语句的形式来表达. 给出下面RTL图的verilog描述. 1)纯过程语句描述 2)纯连续赋值语句描述 参 ...
- android主线程ActivityThread
ActivityThread在Android中它就代表了Android的主线程,但是并不是一个Thread类. 源码如下: http://androidxref.com/6.0.0_r1/xref/f ...
- 日志收集之filebeat
一,软件介绍 Filebeat是一个轻量级日志传输Agent,可以将指定日志转发到Logstash.Elasticsearch.Kafka.Redis等中.Filebeat占用资源少,而且安装配置也比 ...