Stream流

  • Stream流的三类方法
  • Stream流的获取方法
  • Stream流的中间操作常用方法
    • filter方法
    • limit方法
    • skip方法
    • concat方法
    • distinct方法
  • Stream流的终结操作常用方法
    • forEach方法
    • count方法
  • Stream流的收集方法
  • Stream流案例练习

Stream流的三类方法

  • 获取Stream

    创建一条流水线,并把数据放到流水线上准备操作

  • 中间方法

    流水线上的操作

    可以执行多个操作

  • 终结方法

    流水线的最后一个操作

    一个Stream流只能有一个终结方法

Stream流的获取方法

Stream流可以使用在 单列集合双列集合数组同种数据类型多个数据 这四种情况下

  • 单列集合

    ArrayList<String> list = new ArrayList<>(List.of("a", "b", "c"));
    list.stream().forEach(s -> System.out.println(s));
    // 输出结果
    // a
    // b
    // c
    
  • 双列集合

    HashMap<String, String> hm = new HashMap<>();
    hm.put("20001", "zhangsan");
    hm.put("20002", "lisi");
    hm.put("20003", "wangwu");
    // 先获取所有的键,然后通过stream流输出键
    hm.keySet().stream().forEach(s -> System.out.println(s));
    // 输出结果
    // 20003
    // 20002
    // 20001
    
    HashMap<String, String> hm = new HashMap<>();
    hm.put("20001", "zhangsan");
    hm.put("20002", "lisi");
    hm.put("20003", "wangwu");
    // 先获取所有的键值对对象,然后通过stream流输出所有对象
    hm.entrySet().stream().forEach(s -> System.out.println(s));
    // 输出结果
    // 20003=wangwu
    // 20002=lisi
    // 20001=zhangsan
    
  • 数组

    int[] arr= {1, 2, 3, 4, 5};
    Arrays.stream(arr).forEach(s -> System.out.println(s));
    // 输出结果
    // 1
    // 2
    // 3
    // 4
    // 5
    
  • 同种数据类型多个数据

    Stream.of(1, 2, 3, 4, 5).forEach(s -> System.out.println(s));
    // 输出结果
    // 1
    // 2
    // 3
    // 4
    // 5
    

Stream流的中间操作常用方法

filter方法

Stream<T> filter(Predicate predicate):用于对流中数据进行过滤

Predicate 接口中只有一个抽象方法 boolean test(T t) 参数 t 为流中的每一个数据,该方法返回一个布尔值,如果返回的结果为 true 则当前数据留下,如果返回的结果为 false 则过滤掉当前数据

  • 实现案例

    • 使用匿名函数作为参数

      ArrayList<String> list = new ArrayList<>(List.of("赵四", "赵围", "张三", "李四"));
      list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {Boolean result = s.startsWith("赵");return result;}
      }).forEach(s -> System.out.println(s));// 输出结果
      // 赵四
      // 赵围
      
    • 使用lambda函数作为参数

      因为Predicate接口中只有一个抽象方法 test,所以可以使用lambda表达式来达到简化代码的目的

      ArrayList<String> list = new ArrayList<>(List.of("赵四", "赵围", "张三", "李四"));
      list.stream().filter((String s) -> {Boolean result = s.startsWith("赵");return result;
      }).forEach(s -> System.out.println(s));// 输出结果
      // 赵四
      // 赵围
      
    • 简化lambda函数

      ArrayList<String> list = new ArrayList<>(List.of("赵四", "赵围", "张三", "李四"));
      list.stream().filter(s -> s.startsWith("赵")).forEach(s -> System.out.println(s));
      

limit方法

Stream<T> limit(long maxSize)截取指定参数个数的数据

ArrayList<String> list = new ArrayList<>();
list.add("小明");
list.add("小鸿");
list.add("小红");
list.add("小华");
list.stream().limit(2).forEach(s -> System.out.println(s));// 输出结果
// 小明
// 小鸿

skip方法

Stream<T> skip(long n)跳过指定参数个数的数据

ArrayList<String> list = new ArrayList<>();
list.add("小明");
list.add("小鸿");
list.add("小红");
list.add("小华");
list.stream().skip(2).forEach(s -> System.out.println(s));// 输出结果
// 小红
// 小华

concat方法

static <T> Stream<T> concat(Stream a, Stream b)合并 ab 两个流为一个流

ArrayList<String> list = new ArrayList<>();
list.add("小明");
list.add("小鸿");
list.add("小红");
list.add("小华");ArrayList<String> list2 = new ArrayList<>();
list2.add("小花");
list2.add("小爱");
list2.add("小密");
list2.add("小五");Stream.concat(list.stream(), list2.stream()).forEach(s -> System.out.println(s));// 输出结果
// 小明
// 小鸿
// 小红
// 小华
// 小花
// 小爱
// 小密
// 小五

distinct方法

Stream<T> distinct():去除流中重复的元素,依赖(hashCode()equals()方法)

ArrayList<String> list = new ArrayList<>();
list.add("小明");
list.add("小鸿");
list.add("小红");
list.add("小华");
list.add("小华");
list.add("小华");
list.stream().distinct().forEach(s -> System.out.println(s));// 输出结果
小明
小鸿
小红
小华

Stream流的终结操作常用方法

  • forEach(Consumer action):对流的每个元素执行操作

    • Consumer接口中只有一个 void accept(T t) 方法,该方法对给定的参数执行此操作
  • long count():返回流中的元素个数

forEach方法

  • 匿名内部类传参

    ArrayList<String> list = new ArrayList<>(List.of("1", "2", "3"));
    // 匿名内部类传参
    list.stream().forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}
    });// 输出结果
    // 1
    // 2
    // 3
    
  • lambda函数传参

    因为Consumer接口里只有一个抽象方法accept,所以可以使用lambda函数简化代替

    ArrayList<String> list = new ArrayList<>(List.of("1", "2", "3"));
    list.stream().forEach((String s) -> {System.out.println(s);
    });// 输出结果
    // 1
    // 2
    // 3
    
  • 简化lambda函数

    ArrayList<String> list = new ArrayList<>(List.of("1", "2", "3"));
    list.stream().forEach(s -> System.out.println(s));// 输出结果
    // 1
    // 2
    // 3
    

count方法

long count = list.stream().count();
System.out.println(count);// 输出结果
// 3

Stream流的收集方法

通过stream流获取到的集合、数组等类型的数据进行修改操作,但是源数据是没有改变的,我们无法直接修改源数据,但是我们可以使用相关方法对流中的数据进行保存

  • Stream流的收集方法

    R collect(Collector collector)

  • 工具类Collectors提供的具体收集方式

    • public static <T> Collector toList():把元素收集到 List 集合中

      ArrayList<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7, 7, 7));
      List<Integer> collectList = list.stream().filter(number -> number % 2 == 1).collect(Collectors.toList());
      System.out.println(collectList); // [1, 3, 5, 7, 7, 7]
      
    • public static <T> Collector toSet():把元素收集到 Set 集合中

      ArrayList<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7, 7, 7));
      Set<Integer> collectSet = list.stream().filter(number -> number % 2 == 1).collect(Collectors.toSet());
      System.out.println(collectSet); // [1, 3, 5, 7]
      
    • public static <T> Collector toMap(Function keyMapper, Function valueMapper):把元素收集到 Map 集合中

      创建一个 ArrayList 集合,集合添加这些元素 “zhangsan,24”、“lisi,18”、“wangwu,26”、“zhaoliu,20” ,这些元素前面是姓名,后面是年龄;现需将里面的元素筛选出来,条件是年龄大于等于24岁的,并把帅选出来的数据保存到 Map 集合中,姓名为键,年龄为值。

      ArrayList<String> list = new ArrayList<>();
      list.add("zhangsan,24");
      list.add("lisi,18");
      list.add("wangwu,26");
      list.add("zhaoliu,20");Map<String, String> map = list.stream().filter(s -> {String[] split = s.split(",");int age = Integer.parseInt(split[1]);return age >= 24;
      }).collect(Collectors.toMap(s -> s.split(",")[0],s -> s.split(",")[1]
      ));
      System.out.println(map); // {zhangsan=24, wangwu=26}
      

      toMap() 里的第一个 lambda 表达式是如何获取 Map 集合元素中的键,第二个 lambda 表达式是如何获取 Map 集合元素中的值

Stream流案例练习

现有两个 ArrayList 集合,分别存储5名男同学和5名女同学的名字,要求完成以下操作:

  • 男同学只要名字为3个字的前三个人
  • 女同学只要姓李的,并且跳过第一个人
  • 将过滤后的男同学和女同学的姓名合并到一起
  • 完成合并操作后得到的元素作为构造方法的参数创建学生对象,然后遍历数据
    • 学生类 Student ,里面有一个成员变量,一个不带参数的构造方法,一个带参数构造方法,以及成员变量对应的 getset 方法,还有 toString() 方法

学生类

package com.cmy.streamdemo;/*** @author chenmingyong*/
public class Student {private String stuName;public Student(String stuName) {this.stuName = stuName;}public String getStuName() {return stuName;}public void setStuName(String stuName) {this.stuName = stuName;}@Overridepublic String toString() {return "Student{" +"stuName='" + stuName + '\'' +'}';}
}

测试类

package com.cmy.streamdemo;import java.util.ArrayList;
import java.util.stream.Stream;/*** @author chenmingyong*/
public class Practice {public static void main(String[] args) {// 创建存储男同学的姓名集合ArrayList<String> maleList = new ArrayList<>();maleList.add("轩辕浅");maleList.add("百里回");maleList.add("百殇");maleList.add("慕容凰");maleList.add("洋希");maleList.add("诸葛尘");// 创建存储女同学的姓名集合ArrayList<String> femaleList = new ArrayList<>();femaleList.add("李疏寒");femaleList.add("凌雪姣");femaleList.add("江舞寒");femaleList.add("李梦儿");femaleList.add("李楠楠");femaleList.add("李锦");// 筛选男同学,只要名字为3个字的前三个人Stream<String> maleStream = maleList.stream().filter(male -> male.length() == 3).limit(3);// 筛选女同学,只要姓李的,并且跳过第一个人Stream<String> femaleStream = femaleList.stream().filter(female -> female.startsWith("李")).skip(1);// 合并两个流并将得到的元素作为构造方法的参数创建学生对象,然后遍历数据Stream.concat(maleStream, femaleStream).forEach(s -> {Student student = new Student(s);System.out.println(student);});}
}

Java Stream流相关推荐

  1. java Stream 流

    java Stream 流 Stream 流 流的创建 流的转化 Optianal 流的计算 Stream 流 1. Stream的定义 来自数据源的支持聚合操作的元素序列. 即一个流对外提供接口,接 ...

  2. 测试Java Stream流 parralle与 sequential的效率

    测试Java Stream流 parralle与 sequential的效率 实验环境 操作系统:win10 处理器:Intel i5-4200U 2核4线程 Java版本:1.8 实验方案 统计大小 ...

  3. Java stream流式计算详解

    Java stream流式计算详解 1. Stream概述 1.1 Stream简介 1.2 Stream分类 2. Stream操作 2.1 Stream创建 2.2 Stream无状态操作 2.3 ...

  4. Java Stream流基础

    Java Stream流基础 何为Steam流? Stream 是对集合数组对象功能的增强,其专注于对集合数组对象进行各种非常便利.高效的聚合操作,或者大批量数据操作.通常我们需要多行代码才能完成的操 ...

  5. Java Stream流之求和

    Java Stream流之求和 流方式实现 基本数据类型 和 包装类型 的一位数组求和 package top.yangbocsu;import java.util.Arrays;/*** @auth ...

  6. Java Stream流的概念

    为什么80%的码农都做不了架构师?>>>    1. Java的流分为 Inputstream 和 OutputStream: 2. 流(stream)的概念源于UNIX中管道(pi ...

  7. Java Stream(流)的分类, 四大基本流的介绍

    上一篇文章已经介绍过什么是流, 以及流的基本概念 http://blog.csdn.net/nvd11/article/details/29917065 本文主要介绍java四大基本流的方法. 一, ...

  8. Java Stream流总结

    Java8新增的Stream,配合同版本出现的 Lambda ,给我们操作集合(Collection)提供了极大的便利. 文章目录 前言 一.stream是什么? 二.使用步骤 1.得到sream 2 ...

  9. Java -Stream流和常见函数式接口

    概念 流(Stream)与集合类似,但集合中保存的是数据,而Stream中保存对集合或数组数据的操作. 特点 tream 自己不会存储元素. Stream 不会改变源对象.相反,他们会返回一个持有结果 ...

  10. 深度掌握 Java Stream 流操作,让你的代码高出一个逼格

    概念 Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选.排序.聚合等. Stream` 的操作符大体上分为两种:`中间操作符`和`终止操 ...

最新文章

  1. Android RadioButton 修改选择框
  2. linux服务器root的密码修改
  3. android 多个属性值,android布局属性值fill_parent和match_parent
  4. C#反射调用 异常信息:Ambiguous match found.
  5. [转]密码技术-实现数字信封和数字签名
  6. android so abi适配,Android NDK学习(六): so文件兼容之abiFilters的使用
  7. 2018最新版硬盘装系统,不要U盘也能装
  8. Real Application Cluster 10g安装与配置(下)
  9. php正则 网址,php使用正则表达式获取字符串中的URL
  10. 码云怎么创建公开的仓库_使用码云创建属于你的免费私有git仓库
  11. 【机器人技术基础】MATLAB Robotics Toolbox PUMA560 运动学正逆解
  12. android 手机 基站定位软件,安卓手机基站+GPS定位源码
  13. CentOs7下Zabbix安装教程——zabbix agent安装和前端配置
  14. 计算机-flash遮罩层动画,flash遮罩层动画作业
  15. python flash游戏_基于Python的Flash游戏人工智能
  16. php怎么联网,家庭宽带上网连接方式
  17. 温湿度传感器—HDC1080
  18. DW_axi_dmac控制器(概述)
  19. 东软云HIS医疗管理系统——技术栈【SpringBoot+Vue+MySQL+MyBatis】
  20. 移动拼图游戏(八数码问题)A*版

热门文章

  1. 鬼谷八荒宗门亲密度怎么提升
  2. 内温的整体优先效应实验_认知
  3. 驰骋计算产业数十年的Wintel联盟开始分崩离析
  4. 程序员该如何提高睡眠质量?
  5. 怎么用计算机控制打印机扫描,打印机怎么设置扫描到电脑 打印机设置扫描的步骤方法...
  6. 使用python的turtle绘画滑稽脸
  7. instanceof和containsKey以及claims.getExpiration()以及expiration.before()的用法
  8. CodeForces 595A Vitaly and Night
  9. 加拿大 计算机学校排名2015,2015年加拿大大学综合排名
  10. AVC/HEVC/VVC/AV1 块划分、帧内预测过程及预测模式编码