java8新特性(四)_Stream详解

时间:2022-03-16 16:15:52

之前写过一篇用stream处理map的文章,但是对stream没有一个整体的认识,这次结合并发编程网和ibm中介绍stream的文章进行一个总结,我会着重写对list的处理,毕竟实际工作中大家每天进行使用

Stream简单介绍

定义

  • A sequence of elements supporting sequential and parallel aggregate operations.

  • 支持顺序并行聚合操作的元素序列

看看大神们怎么解读的

大家可以把Stream当成一个高级版本的Iterator。原始版本的Iterator,用户只能一个一个的遍历元素并对其执行某些操作;高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如“过滤掉长度大于10的字符串”、“获取每个字符串的首字母”等,具体这些操作如何应用到每个元素上,就给Stream就好了

简单demo

写一个过滤null的简单功能
    public static void main(String[] args) {

        List arrys = Arrays.asList(1, null, 3, 4);
arrys.forEach(System.out::print);
System.out.println();
arrys = (List) arrys.stream()
.filter(num -> num != null)
.collect(Collectors.toList());
arrys.forEach(System.out::print); }

执行结果

1null34
134
解析代码

java8新特性(四)_Stream详解

1、 创建Stream;

2、 转换Stream(处理数据),每次转换原有Stream对象不改变,返回一个新的Stream对象(可以有多次转换);

3、 对Stream进行聚合(Reduce)操作,获取想要的结果;

创建Stream

最常用的创建Stream有两种途径:

  • 通过Stream接口的静态工厂方法
  • 通过Collection接口的默认方法–stream(),把一个Collection对象转换成Stream(之前写的文章对于map的处理就是基于这个)
// 1. Individual values
Stream stream = Stream.of("a", "b", "c");
// 2. Arrays
String [] strArray = new String[] {"a", "b", "c"};
stream = Stream.of(strArray);
stream = Arrays.stream(strArray);
// 3. Collections(实际工作中经常用到)
List<String> list = Arrays.asList(strArray);
stream = list.stream();

转换Stream方法详解

这里其实是大家常用到的,着重讲解这里,这里的图片来自并发编程网,不得不佩服,程序写的好,画图也比我画的好

distinct

distinct: 对于Stream中包含的元素进行去重操作(去重逻辑依赖元素的equals方法),新生成的Stream中没有重复的元素;

示意图

java8新特性(四)_Stream详解

代码演示
    public static void main(String[] args) {

        List<String> list = Arrays.asList("java---", "java---", "erlang---", "lua---", "lua---");
list.forEach(System.out::print);
System.out.println();
list = list.stream()
.distinct()
.collect(Collectors.toList());
list.forEach(System.out::print); }

结果

java---java---erlang---lua---lua---
java---erlang---lua---

filter

filter: 对于Stream中包含的元素使用给定的过滤函数进行过滤操作,新生成的Stream只包含符合条件的元素;

示意图

java8新特性(四)_Stream详解

代码演示
    public static void main(String[] args) {

        List<String> list = Arrays.asList("java---", "java---", "erlang---", "lua---", "lua---");
list.forEach(System.out::print);
System.out.println();
list = list.stream()
.filter(e -> e.length() > 7)
.collect(Collectors.toList());
list.forEach(System.out::print); }

结果

java---java---erlang---lua---lua---
erlang---

map

map:它的作用就是把 input Stream 的每一个元素,映射成 output Stream 的另外一个元素。

示意图

java8新特性(四)_Stream详解

代码演示
    public static void main(String[] args) {

        List<String> list = Arrays.asList("java---", "java---", "erlang---", "lua---", "lua---");
list.forEach(System.out::print);
System.out.println();
list = list.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
list.forEach(System.out::print); }

结果

java---java---erlang---lua---lua---
JAVA---JAVA---ERLANG---LUA---LUA---

limit

limit: 对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素;

示意图

java8新特性(四)_Stream详解

代码演示
    public static void main(String[] args) {

        List<String> list = Arrays.asList("java---", "java---", "erlang---", "lua---", "lua---");
list.forEach(System.out::print);
System.out.println();
list = list.stream()
.limit(3)
.collect(Collectors.toList());
list.forEach(System.out::print); }

结果

java---java---erlang---lua---lua---
java---java---erlang---

skip

skip:返回一个丢弃原Stream的前N个元素后剩下元素组成的新Stream,如果原Stream中包含的元素个数小于N,那么返回空Stream;

示意图

java8新特性(四)_Stream详解

代码演示
    public static void main(String[] args) {

        List<String> list = Arrays.asList("java---", "java---", "erlang---", "lua---", "lua---");
list.forEach(System.out::print);
System.out.println();
list = list.stream()
.skip(3)
.collect(Collectors.toList());
list.forEach(System.out::print); }

结果

java---java---erlang---lua---lua---
lua---lua---

findFirst

findFirst:它总是返回 Stream 的第一个元素,或者空。这里比较重点的是它的返回值类型:Optional

示意图

java8新特性(四)_Stream详解

代码演示
    public static void main(String[] args) {

        List<String> list = Arrays.asList("java---", "java---", "erlang---", "lua---", "lua---");
list.forEach(System.out::print);
System.out.println();
Optional<String> first = list.stream()
.findFirst(); System.out.println(first.get()); }

结果

java---java---erlang---lua---lua---
java---

总结

当然,还有很多方法,这里不一一介绍,现实工作中使用常常结合起来

比如这段代码就是之前文章 过滤map 中 null值和空串的例子

public static Map<String, Object> parseMapForFilterByOptional(Map<String, Object> map) {

        return Optional.ofNullable(map).map(
(v) -> {
Map params = v.entrySet().stream()
.filter((e) -> checkValue(e.getValue()))
.collect(Collectors.toMap(
(e) -> (String) e.getKey(),
(e) -> e.getValue()
)); return params;
}
).orElse(null);
}

总之,Stream 的特性可以归纳为:

不是数据结构

  • 它没有内部存储,它只是用操作管道从 source(数据结构、数组、generator function、IO channel)抓取数据。
  • 它也绝不修改自己所封装的底层数据结构的数据。例如 Stream 的 filter 操作会产生一个不包含被过滤元素的新 Stream,而不是从 source 删除那些元素。
  • 所有 Stream 的操作必须以 lambda 表达式为参数

参考文章

-[1.]https://ifeve.com/stream/

-[2.]https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/

java8新特性(四)_Stream详解的更多相关文章

  1. java8 array、list操作 汇【3】)(-Java8新特性之Collectors 详解

    //编写一个定制的收集器 public static class MultisetCollector<T> implements Collector<T, Multiset<T ...

  2. java8新特性—四大内置核心接口

    java8新特性-四大内置核心接口 四大内置核心接口 //消费型接口 Consumer<T>:: vode accept(T t); //供给型接口 Supplier<T>:: ...

  3. IOS6 新特性之UIActivityViewController详解

    新的IOS6增加了一些新特性.因为应用需要,所以在国庆的几天里.研究了一下IOS6的说明文档,然后大概地总结了一下UIActivityViewController的用法与大家分享. 首先 从实际效果入 ...

  4. Swift 3 新特性和迁移详解

    写在前面 Swift 3.0 正式版发布了差不多快一个月了,断断续续的把手上和 Swift 相关的迁移到了Swift 3.0.所以写点小总结. 背景 代码量(4万行) 首先,我是今年年初才开始入手 S ...

  5. h5新特性 File API详解

    之前一直觉得h5的新特性就是一些新标签呢,直到想研究一下图片上传预览的原理,才发现还是有好多新的api的,只是不兼容ie低版本,挺可惜的, File API在表单中文件输入字段基础上,又添加了一些直接 ...

  6. java8新特性——四大内置核心函数式接口

    在前面几篇简单介绍了一些Lambda表达式得好处与语法,我们知道使用Lambda表达式是需要使用函数式接口得,那么,岂不是在我们开发过程中需要定义许多函数式接口,其实不然,java8其实已经为我们定义 ...

  7. &lbrack;C&plus;&plus;11新特性&rsqb; 智能指针详解

    动态内存的使用很容易出问题,因为确保在正确的时间释放内存是极为困难的.有时我们会忘记释放内存产生内存泄漏,有时提前释放了内存,再使用指针去引用内存就会报错. 为了更容易(同时也更安全)地使用动态内存, ...

  8. Android新特性Instant Run详解

    关于 Instant Run Android Studio 2.0 中引入的 Instant Run 是 Run 和 Debug 命令的行为,可以大幅缩短应用更新的时间.尽管首次构建可能需要花费较长的 ...

  9. Spring Boot 2&period;3 新特性优雅停机详解

    什么是优雅停机 先来一段简单的代码,如下: @RestController public class DemoController { @GetMapping("/demo") p ...

  10. Java8新特性 -- 四大内置的核心函数式接口

    可以把这些函数式接口作为方法的参数. 1.0 核心内置函数式接口一: 消费型接口@FunctionalInterfacepublic interface Consumer<T> { voi ...

随机推荐

  1. WPF-系统托盘

    WPFSystemTray.cs public class WPFSystemTray { /// <summary> /// 设置系统托盘 /// </summary> // ...

  2. 对LR关联的一些理解

    从接触LR关联的迷茫,到现在略有感悟,小记期间的一些理解. 一开始认识关联是在LR自带学习例子,需要关联session,也知道了自动关联,手动关联以及边录制边关联. 在使用关联的过程中,也学习了web ...

  3. Surface Normal Vector in OpenCascade

    Surface Normal Vector in OpenCascade eryar@163.com 摘要Abstract:表面上某一点的法向量(Normal Vector)指的是在该点处与表面垂直的 ...

  4. centos设置静态IP

    1.编辑网卡文件 vi /etc/sysconfig/network-scripts/ifcfg-eth0 # eth0为网卡编号 设置网卡eth0的IPV4信息,需要注意的是,设置的IPADDR需要 ...

  5. ajax加载模块实时刷新的原理

    var loadMenu = function(data) {        var trs = template.render('menu-list-temp', {'list': data});  ...

  6. 如何在十分钟内插入1亿条记录到Oracle数据库?

    这里提供一种方法,使用 APPEND 提示,使得十分钟内插入上亿数据成为可能. -- Create table create table TMP_TEST_CHAS_LEE ( f01 VARCHAR ...

  7. 5&period;7 C和C&plus;&plus;的关系

  8. BZOJ 1688&colon; Disease Manangement (子集枚举)

    Disease Manangement Q - 枚举子集 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d &a ...

  9. Spring Data Elasticsearch

    项目清单   elasticsearch服务下载包括其中插件和分词   http://download.csdn.net/detail/u014201191/8809619   项目源码   资源文件 ...

  10. jQuery焦点图切换特效插件封装

    网站焦点图是一种网站内容的展现形式,可简单理解为一张图片或多张图片展现在网页上就是网站焦点图.在网站很明显的位置,用图片组合播放的形式,类似焦点新闻的意思只不过加上了图片.一般多使用在网站首页版面或频 ...