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-流的更多相关文章

  1. java - day013 - 流, FileInputStream, BufferedInputStream,

    流 Stream 把数据的读写,抽象成数据在管道中流动. 流是单向的 输入流, 只能用来读取数据 输出流, 只能用来输出数据 流只能顺序读写数据 流只能一次性从头到尾读写数据 流动过的数据,不能反复流 ...

  2. 使用C#处理基于比特流的数据

    使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...

  3. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  4. FILE文件流的中fopen、fread、fseek、fclose的使用

    FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...

  5. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  6. java 字节流与字符流的区别

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...

  7. BZOJ 3504: [Cqoi2014]危桥 [最大流]

    3504: [Cqoi2014]危桥 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1407  Solved: 703[Submit][Status] ...

  8. java I/O流

    输入流(读取数据的流) BufferedInputStream---继承--->FileInputStream--继承--->InputStream------> (1)字节流操作中 ...

  9. Ford-Fulkerson 最大流算法

    流网络(Flow Networks)指的是一个有向图 G = (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0.如果 (u, v) ∉ E 则可以规定 c(u, ...

  10. .NET基础拾遗(3)字符串、集合和流

    Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...

随机推荐

  1. win10 oracle11g安装问题:INS-13001环境不满足最低要求

    打开database文件夹,找到stage,然后cvu,找到cvu_prereq.xml文件,用记事本打开,增添下面内容: <OPERATING_SYSTEM RELEASE="6.2 ...

  2. 【数学】【筛素数】Miller-Rabin素性测试 学习笔记

        Miller-Rabin是一种高效的随机算法,用来检测一个数$p$是否是素数,最坏时间复杂度为$\log^3 p$,正确率约为$1-4^{-k}$,$k$是检验次数. 一.来源     Mil ...

  3. web 页面 验证码 实现

    1. 前台页面代码:  页面刷新时会自动请求 ${pageContext.request.contextPath}/yanzheng?yz=&time=-1111 这个action <f ...

  4. 【研究】CVE-2017-11882-Office远程代码执行漏洞复现

    实验环境:win10+kali 工具:koadic,Command43b_CVE-2017-11882.py KALI: root@kali:/opt/koadic-master# ./koadic ...

  5. ali代码风格

    如下: <?xml version="1.0" encoding="UTF-8" standalone="no"?><pr ...

  6. Unity GetComponentsInChildren<T>(true);

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class GetCompo ...

  7. vue嵌套路由 && 404重定向

    第一部分: vue嵌套路由 嵌套路由是什么? 嵌套路由就是在一个被路由过来的页面下可以继续使用路由,嵌套也就是路由中的路由的意思.  比如在vue中,我们如果不使用嵌套路由,那么只有一个<rou ...

  8. 全文检索~solr的使用

    全文检索这个系列在几前年写过lucene的文章,而现在看来它确实已经老了,它的儿子孙子都出来了,已经成为现在检索行列的主流,像solr,elasticsearch等,今天我们主要来看一个solr在as ...

  9. Android ContentProvider的介绍(很详细)

    博客分类: android进阶   一.ContentProvider的概念 ContentProvider:为存储和获取数据提供统一的接口.可以在不同的应用程序之间共享数据.Android已经为常见 ...

  10. C++ Memory System Part3 : 优化

    前面的系列我们讲了自定义new和delete操作,其中针对deleteArray的问题还有需要优化的地方.我们这次就针对POD类型进行一次优化. 下面的代码是针对POD类型的模板函数实现,分别为New ...