一、Stream 流

1.1 概念

官方解释:可以支持顺序和并行对元素操作的元素集合。

简单来讲,Stream 就是 JDK8 提供给我们的对于元素集合统一、快速、并行操作的一种方式。

它能充分运用多核的优势,以及配合 Lambda 表达式、链式结构对集合等进行许多有用的操作。

1.2 特征

  • Pipelining: 所有中间操作都会返回流对象本身,这样多个操作可以串联成一个管道。
  • 内部迭代: 通过 Iterator 或者增强 for 的形式在集合外部进行迭代的操作叫做外部迭代,而 Stream提供了内部迭代的方法,流可以直接调用遍历方法。

当使用一个流的时候,通常需要三个步骤:

获取数据源 --> 数据转换 --> 执行操作

每次转换操作时,原有的 Stream 对象不改变,返回一个新的 Stream对象。

二、获取流

java.util.stream.Stream<T> 是 Jdk 8 新添加的流接口(并不是一个函数式接口),通常有以下几种常用方式:

  • 所有的 Collection 集合都可以通过 Stream 默认方法获取流;
  • Stream 接口的静态方法 of 可以获取数组对应的流。

2.1 根据 Collection 获取流

public class DemoGetStream {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
Stream<String> listStream = list.stream(); Set<String> set = new HashSet<>();
Stream<String> setStream = set.stream(); } }

2.2 根据 Map 获取流

public class DemoGetStream {

    public static void main(String[] args) {
Map<String,Object> map = new HashMap<>();
Stream<String> keyMapStream = map.keySet().stream();
Stream<Object> valueMapStream = map.values().stream();
Stream<Map.Entry<String, Object>> entryStream = map.entrySet().stream();
} }

2.3 根据数组获取流

public class DemoGetStream {

    public static void main(String[] args) {
String[] strArray = {"a","b","c"};
Stream<String> strStream= Stream.of(strArray);
Integer[] intArray = {1,2,-3,44,100};
Stream<Integer> intStream= Stream.of(intArray);
} }

三、常用方法

Stream 有很多操作方法,分为两种类型:

  • 延迟方法: 返回值类型仍然是 Stream 接口自身类型的方法,因此支持链式调用。
  • 终结方法: 返回值类型不再是 Stream 接口自身类型的方法,因此不支持链式调用。
方法名称 方法类型 作用 方法含义
forEach 终结方法 循环 接收一个 Consumer 对象,将每一个流元素交给该函数进行处理
filter 延迟方法 过滤 接收一个 Predicate 对象 作为筛选条件,将一个流筛选为另一个流
map 延迟方法 映射 接收一个 Function 对象,将当前流中的 T 类型数据转换为 R 类型的流
count 终结方法 统计 统计流中的个数
limit 延迟方法 取前几个对象 对流进行截取,只取前 N 个对象
skip 延迟方法 跳过前几个对象 对流进行截取,跳过前 N 个对象
concat 延迟方法 组合 将两个流合并成一个流

3.1 forEach 方法

格式:

void forEach(Consumer<? super T> action);

实例:

public class DemoStreamForEach {

    public static void main(String[] args) {
Stream<String> stream = Stream.of("三国演义","红楼梦","西游记","三字经");
stream.forEach(s -> System.out.println(s));
} }

3.2 filter 方法

格式:

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

实例:

public class DemoStreamFilter {

    public static void main(String[] args) {
Stream<String> stream = Stream.of("三国演义", "红楼梦", "西游记", "三字经");
stream
.filter(s -> s.contains("三"))
.forEach(s -> System.out.println(s));
} }

3.3 map 方法

格式:

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

实例:

public class DemoStreamMap {

    public static void main(String[] args) {
Stream<String> stream = Stream.of("10", "2", "33");
Stream<Integer> integerStream = stream.map(s -> Integer.parseInt(s));
} }

3.4 count 方法

格式:

long count();

实例:

public class DemoStreamCount {

    public static void main(String[] args) {
Stream<String> stream = Stream.of("三国演义", "红楼梦", "西游记", "三字经");
System.out.println(stream.count()); } }

3.5 limit 方法

格式:

Stream<T> limit(long maxSize);

实例:

public class DemoStreamLimit {

    public static void main(String[] args) {
Stream<String> stream = Stream.of("三国演义", "红楼梦", "西游记", "三字经");
stream
.limit(3)
.forEach(s -> System.out.println(s));
} }

3.6 skip 方法

格式:

Stream<T> skip(long n);

实例:

public class DemoStreamSkip {

    public static void main(String[] args) {
Stream<String> stream = Stream.of("三国演义", "红楼梦", "西游记", "三字经");
stream
.skip(3)
.forEach(s -> System.out.println(s));
} }

3.7 concat 方法

格式:

static <T> Stream<T> concat(Stream<? extends T> a,Stream<? extends T> b);

实例:

public class DemoStreamConcat {

    public static void main(String[] args) {
Stream<String> chinaBooksStream = Stream.of("三国演义", "红楼梦", "西游记", "三字经");
Stream<String> foreignBooksStream = Stream.of("悲惨世界", "哈里波特");
Stream
.concat(chinaBooksStream, foreignBooksStream)
.forEach(s -> System.out.println(s));
} }

Lambda学习总结(二)--Stream流的更多相关文章

  1. (六)jdk8学习心得之Stream流

    六.Stream流 1. 什么是stream流 现阶段,可以把stream流看成一个高级版的Iterator.普通的Iterator只能实现遍历,遍历做什么,就需要具体些功能代码函数了.而这个stre ...

  2. Java8系列 (二) Stream流

    概述 Stream流是Java8新引入的一个特性, 它允许你以声明性方式处理数据集合, 而不是像以前的指令式编程那样需要编写具体怎么实现. 比如炒菜, 用指令式编程需要编写具体的实现 配菜(); 热锅 ...

  3. java8新特性学习笔记(二) 使用流(各种API)

    筛选和切片 用谓词筛选,筛选出各个不相同的元素,忽略流中的头几个元素,或将流截断至指定长度 用谓词筛选 Stream接口支持filter方法,该操作接受一个谓词(返回一个boolean的函数) 作为参 ...

  4. DirectSound学习(二)--流式缓冲区

    使用流式缓冲方式播放波形音频文件比较复杂,主要原因是在只有一个缓冲区提供给用户的前提下,这个缓冲区在提供给声卡播放数据的同是还需要用户不断的定时向其中写入数据.要注意从缓冲区这时是一个环形缓冲区,声音 ...

  5. easylogging++学习记录(二):流式日志

    easylogging++日志库流式日志的写入,依赖于el::base::Writer类的析构,以debug日志为例:具体代码如下: #define LOG(LEVEL) CLOG(LEVEL, EL ...

  6. 第46天学习打卡(四大函数式接口 Stream流式计算 ForkJoin 异步回调 JMM Volatile)

    小结与扩展 池的最大的大小如何去设置! 了解:IO密集型,CPU密集型:(调优)  //1.CPU密集型 几核就是几个线程 可以保持效率最高 //2.IO密集型判断你的程序中十分耗IO的线程,只要大于 ...

  7. JAVA8学习——从使用角度深入Stream流(学习过程)

    Stream 流 初识Stream流 简单认识一下Stream:Stream类中的官方介绍: /** * A sequence of elements supporting sequential an ...

  8. 010-jdk1.8版本新特性二-Optional类,Stream流

    1.5.Optional类 1.定义 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个 ...

  9. 深度分析:java8的新特性lambda和stream流,看完你学会了吗?

    1. lambda表达式 1.1 什么是lambda 以java为例,可以对一个java变量赋一个值,比如int a = 1,而对于一个方法,一块代码也是赋予给一个变量的,对于这块代码,或者说被赋给变 ...

随机推荐

  1. 增加游戏受众:在英特尔核显上运行MR游戏

    为了获得良好的用户体验,通常VR游戏需要稳定在每秒90帧,这意味着整个场景只有11.1毫秒的时间来进行左右眼渲染,这就是为何VR游戏需要配备高端的独立显卡.现在来看看我们如何使用最新版英特尔图形性能分 ...

  2. &&、()、||决定linux命令的执行顺序

    在执行某个命令时,有时需要依赖前面的命令是否执行成功.假如你想通过ssh命令复制很多数据文件到另外的机器后,删除所有源有文件,所以在删除源有文件之前首先要确定复制是不是执行成功.只要执行复制成功才可以 ...

  3. 【AMAD】python-goose -- HTML Content/Article 提取器

    动机 简介 用法 个人评分 动机 新闻网页,结构大多是类似的. 所以,能不能用一种通用的爬取方法来提取其中的数据? 简介 Goose最初是一个Java项目,在2011年被转为了scala项目1. Py ...

  4. Flume下载安装

    下载 可以apache官网下载flume的安装包 下载时注意,flume具有两个版本,0.9.x和1.x,两个版本并不兼容,我们用最新的1.x版本,也叫flume-ng版本. 安装 解压到指定目录即可 ...

  5. Nexus2 yum插件RCE漏洞(CVE-2019-5475)

    1.漏洞简介: 安全研究员Christian August Holm Hansen在Nexus Repository Manager 2.X中披露了一个远程命令执行漏洞. 该漏洞默认具有部署权限帐户. ...

  6. HDU 1284 钱币兑换问题 (动态规划 背包方案数)

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  7. 在Ubuntu上安装Hive

    1.下载hive2.3.5 解压缩并改名为hive目录,放到/usr/local下(注意权限) sudo mv apache-hive-2.3.5-bin /usr/local/hive 2.修改目录 ...

  8. C++学习 之 指针及动态内存分配(笔记)

    1. 指针 1.1 指针的含义: 简单来说,指针是存储内存地址的变量.当我们声明了一个指针变量后,使用该指针时系统会根据指针内的地址索引内存块,读取内存内的值.指针因为是用来存地址的,所以一般固定长度 ...

  9. Hive 教程(一)-安装与配置解析

    安装就安装 ,不扯其他的 hive 依赖 在 hive 安装前必须具备如下条件 1. 一个可连接的关系型数据库,如 Mysql,postgresql 等,用于存储元数据 2. hadoop,并启动 h ...

  10. Python和其他编程语言

    Python和其他编程语言 一.Python介绍 Python的创始人为吉多·范罗苏姆(Guido van Rossum),如下图,少数几个不秃头的语言创始人.1989年的圣诞节期间,Guido为了打 ...