java8新特性-stream流漫谈

news/2024/5/19 16:17:17 标签: 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进行映射
    List<String> collect = aList.stream().map(B::new).collect(Collectors.toList());
    
  • 排除list中的元素

    java">List<String> listOne = new ArrayList<>();
    listOne.add("张三");
    listOne.add("李四");
    listOne.add("王五");
    
    List<String> listTwo = new ArrayList<>();
    listTwo.add("张三");
    listTwo.add("李四");
    
    // 去除listOne中被listTwo包含的元素,结果:王五
    List<String> resultList = listOne.stream().filter(o -> !listTwo.contains(o)).collect(Collectors.toList());
    
  • 合并两个list,重复元素只保留一个

    java">List<String> listOne = new ArrayList<>();
    listOne.add("张三");
    listOne.add("李四");
    listOne.add("王五");
    
    List<String> listTwo = new ArrayList<>();
    listTwo.add("张三");
    listTwo.add("李四");
    
    List<String> resultList = Stream.of(listOne, listTwo).flatMap(Collection::stream).distinct().collect(Collectors.toList());
    

参考资料:

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

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

相关文章

05-队列(Queue)结构应用分析

文章目录队列(Queue)结构应用分析什么是队列&#xff1f;队列有哪些应用场景&#xff1f;JAVA中常见队列有哪些&#xff1f;Java中队列规范的定义&#xff1f;基于Java数组如何实现队列&#xff1f;基于Java链表如何实现队列&#xff1f;什么是循环队列&#xff1f;为什么要使用…

常用的nmap命令

扫描一台机器&#xff1a; nmap 192.168.0.105 扫描一个范围内的IP&#xff1a; nmap 192.168.0.100/105 TCP SYN Scan&#xff1a; nmap -sS 192.168.0.105 TCP Connection Scan&#xff1a; nmap -sT 192.168.0.105 easily detected UDP Scan: nmap -sU 192.168.0.105 IP…

基于SSM实现前后端分离在线考试管理系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 文末获取源码 项目编号&#xff1a;BS-XX-…

pytorch初学笔记(三)Tranforms的使用

目录 一、transform的用法 1. tranforms的结构 2. transforms的使用步骤 二、 transforms.ToTensor()的使用 1. 内置__call__方法简介 2. ToTensor()使用 2.1 将PIL类型图像转换为tensor型 2.2 将numpy类型图像转换为tensor型 2.3 使用tensorboard显示tensor型图片…

平衡车出口美国需要进行UL2272认证

其电池也需要有UL认证,因为先前出口到美国的电动平衡车出了很多意外,所以现在平衡车如果销售到美国就必须要经过UL认证 UL2272 认证的标准介绍&#xff1a; &#xff08;1&#xff09;UL2272 标准 零部件要求平衡车整车外壳 ( UL746C、 UL746B&#xff09; 充电器&#xff08;二…

什么是“软件定义汽车”

移动出行时代&#xff0c;汽车已逐渐从纯粹由机械驱动的硬件转变为软件驱动的电子产品&#xff1a;当今不同车厂的产品硬件配置已逐渐趋同&#xff0c;在成本和功能改善空间有限的情况下&#xff0c;传统汽车价值链的重构势在必行。车厂打造差异化的核心要素已转向原先与硬件深…

【MySQL知识点】默认约束、非空约束

&#x1f64b;‍ 哈喽大家好&#xff0c;本次是MySQL数据库原理系列第五期 ⭐本期是MySQL的表的约束——默认约束、非空约束 &#x1f3c6;系列专栏&#xff1a;MySQL数据库 &#x1f604;笔者还是前端的菜鸟&#xff0c;还请大家多多指教呀~ &#x1f44d;欢迎大佬指正&#x…

Spring Boot Security 角色授权示例

在本教程中&#xff0c;我将指导您如何使用 Spring 安全性根据用户的角色对用户进行弹簧启动应用程序授权。凭据和角色动态存储在MySQL数据库中。具有休眠功能的弹簧数据JPA用于数据访问层&#xff0c;百里叶与弹簧安全性的集成用于视图层。我们将编写代码来保护现有的Spring B…