java8新特性-Steam流漫谈

news/2024/5/19 15:06:26 标签: 1024程序员节, java, steam, java8新特性

使用stream流能够更加优美,真正做到像写诗一样写代码。

为什么使用stream

  • 可以更方便的操作集合
  • 减少代码量
  • 更加优雅

如何使用

基础使用

首先我们定义一个String集合或者数组,演示如何创建流:

java">// List集合
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream();

创建流很简单,使用.stream()方法即可创建,接下来我们添加几个人名到集合中:

java">// List集合
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");

随后我们面临一个需求,需要找出对应姓的人,比如我要找出姓张的人,这个时候我们不借助流,实现的逻辑如下:

java">List<String> result = new ArrayList<>();
list.forEach(e->{
    if (e.startsWith("张")){
        result.add(e);
    }
});

使用forEach,写个if判断能够实现效果,这个时候我们借助流的实现效果如下:

java">// 定义接收结果集
List<String> result = new ArrayList<>();
list.stream().filter(e -> e.startsWith("张")).forEach(e -> result.add(e));

// 更加简约的写法
List<String> resultList = list.stream().filter(e -> e.startsWith("张")).collect(Collectors.toList());

基本上一行就表达清楚了,而且与上面实现的效果一致,如果有多个过滤条件还可以继续使用.filter()方法进行叠加使用。

上面我们接触了流的filter()过滤器功能,还存在其他的使用方法:

  • limit(long maxSize)

    获取集合前几个属性

    java">// 初始化List集合
    List<String> list = new ArrayList<>();
    list.add("张三");
    list.add("李四");
    list.add("王五");
    // 获取集合前2个属性,结果:张三 李四
    List<String> collect = list.stream().limit(2).collect(Collectors.toList());
    
  • skip(long n)

    跳过指定的前面几个元素

    java">// 初始化List集合
    List<String> list = new ArrayList<>();
    list.add("张三");
    list.add("李四");
    list.add("王五");
    // 跳过前面2个元素,结果:王五
    List<String> collect = list.stream().skip(2).collect(Collectors.toList());
    
  • distinct()

    元素去重

    java">// 初始化List集合
    List<String> list = new ArrayList<>();
    list.add("张三");
    list.add("李四");
    list.add("王五");
    // 增加一个重复元素 张三
    list.add("张三");
    // 去重处理,将重复元素[张三]剔除,结果:张三 李四 王五
    List<String> collect = list.stream().distinct().collect(Collectors.toList());
    
  • sorted()

    排序

    java">// 初始化List集合
    List<String> list = new ArrayList<>();
    list.add("张三");
    list.add("李四");
    list.add("王五");
    list.add("张三");
    list.add("张三丰");
    // 使用默认排序,结果:张三 张三 李四 王五
    List<String> collect = list.stream().sorted().collect(Collectors.toList());
    
    // 使用自定义排序,结果:诸葛孔明 张三丰 张三 李四 王五 张三
    List<String> collect2 = list.stream().sorted(new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            // 根据名字长度倒序排序
            return o2.length() - o1.length();
        }
    }).collect(Collectors.toList());
    
  • allMatch(Predicate<? super T> predicate)

    判断集合中是否有符合条件的属性

    java">List<String> list = new ArrayList<>();
    list.add("张三");
    list.add("李四");
    list.add("王五");
    
    // 判断集合中是否有姓张的属性,结果:true
    boolean flagging = list.stream().allMatch(e -> e.startsWith("张"));
    

进阶使用

  • .stream().map()

    映射

    java">// 定义A类,包含两个构造函数,一个无参构造函数,另一个构造函数接收B类
    class A{
        private int id;
        
        private String name;
        
        public A(){
            
        }
        
        public A(B b){
            this.id = b.getId();
            this.name = b.getName();
        }
    }
    
    
    @Data
    class B{
        private int id;
        private String name;
    }
    
    // 有一个A类集合
    List<A> aList = new ArrayList<>();
    aList.add(new A());
    aList.add(new A());
    aList.add(new A());
    
    // 使用map进行映射,构造A类中接收B类的构造函数
    List<A> collect = aList.stream().map(B::new).collect(Collectors.toList());
    

参考资料:

  • Java8新特性之Steam流详解
  • javasteam流的使用

http://www.niftyadmin.cn/n/1295.html

相关文章

后端php项目和数据库启动

有两种方法可以启动 1.使用小皮面板 ①启动php项目开启后端网站 可去官网下载 下载后就能使用了 官网地址&#xff1a;小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01; 下载完成后打开 php项目需要启动apache 创建一个php项目的网站 注意这里要写public 点击…

【信号检测】基于小波变换的信号趋势检测和分离研究附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

NX二次开发-遍历FTP文件目录

版本VS2013 MFC项目 遍历FTP文件目录实例说明 FTP服务器多用来提供文件的下载。为了了解FTP服务器中的文件信息,有必要获取FTP文件目录。 本例实现了遍历某个FTP服务器中的所有文件目录。 技术要点 本例主要通过CFtpFileFind获取FTP文件目录。首先创建一个CInternetSessi…

Debezium报错处理系列之三十:SQLServerException: 服务器主体 \“dwCDC\“ 无法在当前安全上下文下访问数据库 \“dw\“。

Debezium报错处理系列之三十:SQLServerException: 服务器主体 \"dwCDC\" 无法在当前安全上下文下访问数据库 \"dw\"。 一、完整报错二、报错原因三、解决方法Debezium报错处理系列一:The db history topic is missing. Debezium报错处理系列二:Make sur…

C++学习(6)——模板

系列文章目录 文章目录系列文章目录一、函数模板1.函数模板的实例化&#xff08;1&#xff09;隐式实例化&#xff08;2&#xff09;显式实例化2.模板函数的特性二、类模板一、函数模板 函数模板代表了一个函数系列&#xff0c;该函数模板与类型无关。在使用时被参数化&#x…

Vue3文件拖拽上传

<template><div :class"[drag, { drag-active: active }]" ref"drag"><p class"drag-title">未选择文件/文件夹</p><p class"drag-subtile">支持拖拽到此区域上传&#xff0c;支持选择多个文件/文件夹&…

Qt实现桌面画线、标记,流畅绘制,支持鼠标和多点触控绘制

前言 经常会在网上直播讲课或者点评中看到可以在课件上或者桌面上进行画线标记划重点&#xff0c;其实实现并不难&#xff0c;原理就是在桌面上盖一个透明图层&#xff0c;然后根据鼠标点绘制曲线。 今天分享如何通过Qt的QGraphics体系来实现这个功能&#xff0c;以前的文章已…

施耐德电气“创新开放日”走进中国软件研发中心 以软件与创新驱动产业“双转型”

来源 | 施耐德电气 2022年10月27日&#xff0c;施耐德电气在位于北京亦庄的中国软件研发中心举办“创新开放日”&#xff0c;充分展示其在中国深化研发的战略布局。当天&#xff0c;施耐德电气展示了该中心成立一周年以来的创新研发成果&#xff0c;并与合作伙伴共话软件发展趋…