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与数据库开发基础 ...
随机推荐
- HDU6311 Cover (欧拉路径->无向图有最少用多少条边不重复的路径可以覆盖一个张无向图)
题意:有最少用多少条边不重复的路径可以覆盖一个张无向图 ,输出每条路径的边的序号 , 如果是反向就输出-id. 也就是可以多少次一笔画的方式画完这个无向图. 题解:我们已知最优胜的情况是整个图是欧拉图 ...
- 能量项链 (区间DP)
能量项链 (区间DP) 问题引入 能量项链 洛谷 P1063 思路 诸如此类不能线性规划的问题要用到区间DP,区间DP一般就是三层循环,第一层表示区间长度(本题即\(n\)),第二层枚举起点并根据第一 ...
- 江西理工大学南昌校区排名赛 A: 单身狗的卡片游戏
题目描述 萌樱花是一只单身狗. 萌樱花今天在桌子上摆出了N张卡片,每张卡片i写着一个数字Ai 他不喜欢卡片上的数字多个出现,于是他想搞点事情拆分它们. 从桌子上选出三张卡,去掉一张数字最大,一张数字最 ...
- MySQL 常用show 语句
1. show tables或show tables from database_name; -- 显示当前数据库中所有表的名称. 2. show databases; -- 显示mysql中所有数据 ...
- linux 卡在进度条进不去解决办法之一
centos为例 一, 如下: 如果这个地方卡住了的话也许是你上次改了passwd文件,这个是其中一个情况. 如果刚刚开机就卡住了或者怎么卡住了的话在开机的读条时候摁esc显示读取的进程,根据显示的错 ...
- django设置打印数据库日志
在settings.py中添加: LOGGING = { 'disable_existing_loggers': False, 'version': 1, 'handlers': { 'console ...
- Ace向你推荐一些实用的干货库~开发安卓的好帮手
1 毁灭地球的军火库arsenal- 你想要的枪这里都有卖 哈哈哈哈 , http://android-arsenal.com/ 2 黑科技---在线反编译----嘿嘿嘿 在线反编译 方便简单 客官 ...
- 解决 command not found: express
需要先执行 sudo npm install -g express-generator 再安装 sudo npm install -g express 建立项目骨架 express -e xxx
- 121、Django rest framework入门使用
框架介绍 为你的django平台通过model生成对应的restfull api,并可以通过对应的http接口来进行 post .get.put.delete等操作.本文是也并非入门级别,不会带你去了 ...
- nyoj 600——花儿朵朵——【离散化、线段树插线问点】
花儿朵朵 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 春天到了,花儿朵朵盛开,hrdv是一座大花园的主人,在他的花园里种着许多种鲜花,每当这个时候,就会有一大群游 ...