Stream API

  • Stream API概述
  • 为什么要使用Stream API
  • Stream是什么?
  • Stream 的操作:三个步骤
    • 1- 创建 Stream
      • 创建 Stream方式一:通过集合
      • 创建 Stream方式二:通过数组
      • 创建 Stream方式三:通过Stream的of()
      • 创建 Stream方式四:创建无限流
    • 2- 中间操作
      • 1-筛选与切片
      • 2-映 射
      • 3-排序
    • 3- 终止操作(终端操作)
      • 1-匹配与查找
      • 2-归约
      • 3-收集

Stream API概述

Java8中有两大最为重要的改变。第一个是 Lambda 表达式;另外一个则
是 Stream API。
Stream API ( java.util.stream) 把真正的函数式编程风格引入到Java中。这是目前为止对Java类库最好的补充,因为Stream API可以极大提供Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询

为什么要使用Stream API

实际开发中,项目中多数数据源都来自于Mysql,Oracle等。但现在数据源可以更多了,有MongDB,Radis等,而这些NoSQL的数据就需要Java层面去处理。
Stream 和 Collection 集合的区别:Collection 是一种静态的内存数据结构,而 Stream 是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向 CPU,通过 CPU 实现计算。

Stream是什么?

是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。
“集合讲的是数据,Stream讲的是计算!”
①Stream 自己不会存储元素。
②Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

Stream 的操作:三个步骤

1- 创建 Stream

创建 Stream方式一:通过集合


public void test1(){List list = new ArrayList();list.add(1);list.add(2);list.add(3);
//        default Stream<E> stream() : 返回一个顺序流Stream stream = list.stream();//        default Stream<E> parallelStream() : 返回一个并行流Stream parallelStream = list.parallelStream();}

创建 Stream方式二:通过数组

public void test2(){int[] arr = new int[]{1,2,3,4,5,6};//调用Arrays类的static <T> Stream<T> stream(T[] array): 返回一个流IntStream stream = Arrays.stream(arr);}

创建 Stream方式三:通过Stream的of()

public void test(){Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);}

创建 Stream方式四:创建无限流

public void test(){//      迭代
//      public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)//遍历前10个偶数Stream.iterate(0, t -> t + 2).limit(10).forEach(System.out::println);//      生成
//      public static<T> Stream<T> generate(Supplier<T> s)Stream.generate(Math::random).limit(10).forEach(System.out::println);}

2- 中间操作

先创建一个类,为下面操作提供使用

public class EmployeeData {public static List<Employee> getEmployees(){List<Employee> list = new ArrayList<>();list.add(new Employee(1001, "马化腾", 34, 6000.38));list.add(new Employee(1002, "马云", 12, 9876.12));list.add(new Employee(1003, "刘强东", 33, 3000.82));list.add(new Employee(1004, "雷军", 26, 7657.37));list.add(new Employee(1005, "李彦宏", 65, 5555.32));list.add(new Employee(1006, "比尔盖茨", 42, 9500.43));list.add(new Employee(1007, "任正非", 26, 4333.32));return list;}

1-筛选与切片

public void test1(){//        filter(Predicate p)——接收 Lambda , 从流中排除某些元素。Stream<Employee> stream = list.stream();//练习:查询员工表中薪资大于7000的员工信息stream.filter(e -> e.getSalary() > 7000).forEach(System.out::println);System.out.println();
//        limit(n)——截断流,使其元素不超过给定数量。list.stream().limit(3).forEach(System.out::println);System.out.println();//        skip(n) —— 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补list.stream().skip(3).forEach(System.out::println);System.out.println();
//        distinct()——筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素list.add(new Employee(1010,"刘强东",40,8000));list.add(new Employee(1010,"刘强东",41,8000));list.add(new Employee(1010,"刘强东",40,8000));list.add(new Employee(1010,"刘强东",40,8000));list.add(new Employee(1010,"刘强东",40,8000));//        System.out.println(list);list.stream().distinct().forEach(System.out::println);}

2-映 射

public void test2(){
//        map(Function f)——接收一个函数作为参数,将元素转换成其他形式或提取信息,该函数会被应用到每个元素上,并将其映射成一个新的元素。List<String> list = Arrays.asList("aa", "bb", "cc", "dd");list.stream().map(str -> str.toUpperCase()).forEach(System.out::println);//        练习1:获取员工姓名长度大于3的员工的姓名。List<Employee> employees = EmployeeData.getEmployees();Stream<String> namesStream = employees.stream().map(Employee::getName);namesStream.filter(name -> name.length() > 3).forEach(System.out::println);System.out.println();//练习2:Stream<Stream<Character>> streamStream = list.stream().map(StreamAPITest1::fromStringToStream);streamStream.forEach(s ->{s.forEach(System.out::println);});System.out.println();
//        flatMap(Function f)——接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。Stream<Character> characterStream = list.stream().flatMap(StreamAPITest1::fromStringToStream);characterStream.forEach(System.out::println);}//将字符串中的多个字符构成的集合转换为对应的Stream的实例public static Stream<Character> fromStringToStream(String str){//aaArrayList<Character> list = new ArrayList<>();for(Character c : str.toCharArray()){list.add(c);}return list.stream();

3-排序

public void test4(){
//        sorted()——自然排序List<Integer> list = Arrays.asList(12, 43, 65, 34, 87, 0, -98, 7);list.stream().sorted().forEach(System.out::println);//抛异常,原因:Employee没有实现Comparable接口
//        List<Employee> employees = EmployeeData.getEmployees();
//        employees.stream().sorted().forEach(System.out::println);//        sorted(Comparator com)——定制排序List<Employee> employees = EmployeeData.getEmployees();employees.stream().sorted( (e1,e2) -> {int ageValue = Integer.compare(e1.getAge(),e2.getAge());if(ageValue != 0){return ageValue;}else{return -Double.compare(e1.getSalary(),e2.getSalary());}}).forEach(System.out::println);}}

3- 终止操作(终端操作)

1-匹配与查找

 @Testpublic void test1(){List<Employee> employees = EmployeeData.getEmployees();//        allMatch(Predicate p)——检查是否匹配所有元素。
//          练习:是否所有的员工的年龄都大于18boolean allMatch = employees.stream().allMatch(e -> e.getAge() > 18);System.out.println(allMatch);//        anyMatch(Predicate p)——检查是否至少匹配一个元素。
//         练习:是否存在员工的工资大于 10000boolean anyMatch = employees.stream().anyMatch(e -> e.getSalary() > 10000);System.out.println(anyMatch);//        noneMatch(Predicate p)——检查是否没有匹配的元素。
//          练习:是否存在员工姓“雷”boolean noneMatch = employees.stream().noneMatch(e -> e.getName().startsWith("雷"));System.out.println(noneMatch);
//        findFirst——返回第一个元素Optional<Employee> employee = employees.stream().findFirst();System.out.println(employee);
//        findAny——返回当前流中的任意元素Optional<Employee> employee1 = employees.parallelStream().findAny();System.out.println(employee1);}

2-归约

public void test3(){
//        reduce(T identity, BinaryOperator)——可以将流中元素反复结合起来,得到一个值。返回 T
//        练习1:计算1-10的自然数的和List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);Integer sum = list.stream().reduce(0, Integer::sum);System.out.println(sum);//        reduce(BinaryOperator) ——可以将流中元素反复结合起来,得到一个值。返回 Optional<T>
//        练习2:计算公司所有员工工资的总和List<Employee> employees = EmployeeData.getEmployees();Stream<Double> salaryStream = employees.stream().map(Employee::getSalary);
//        Optional<Double> sumMoney = salaryStream.reduce(Double::sum);Optional<Double> sumMoney = salaryStream.reduce((d1,d2) -> d1 + d2);System.out.println(sumMoney.get());}

3-收集

public void test(){
//        collect(Collector c)——将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法
//        练习1:查找工资大于6000的员工,结果返回为一个List或SetList<Employee> employees = EmployeeData.getEmployees();List<Employee> employeeList = employees.stream().filter(e -> e.getSalary() > 6000).collect(Collectors.toList());employeeList.forEach(System.out::println);System.out.println();Set<Employee> employeeSet = employees.stream().filter(e -> e.getSalary() > 6000).collect(Collectors.toSet());employeeSet.forEach(System.out::println);}
}

Java中的Stream API简述相关推荐

  1. Java中的Stream API :)

    一.流的形成方法 1. 集合 ---> 流集合.stream() 2. 数字流的形成(int型为例)IntStram.of(1,2,3,4) 3. 数组 ---> 流Arrays.stre ...

  2. 在Java 8中使用Stream API列出ZIP文件的内容

    在Java 8 java.util.zip.ZipFile配备了stream方法,该方法可以非常轻松地浏览ZIP文件条目. 在此博客文章中,我将展示许多示例,这些示例显示了我们可以如何快速浏览ZIP文 ...

  3. 在Kotlin代码中要慎用Java 8 的 Stream API

    因为会有性能损失. 测试代码: 1.Java 中直接使用 Java 8 的 Stream API: package i;import java.util.ArrayList; import java. ...

  4. java中List Stream的简单使用

    java中List Stream的简单使用 一,api入门案例 实体类 public class Person {private int id;private String name;private ...

  5. Java 中调用 Apache API 实现图片文件的 压缩 与 解压 实例

    < Java 中调用 Apache API 实现图片文件的 压缩 与 解压 > 为什么不直接使用 Java JDK 中自带的 API 呢?必须使用 Apache API 实现文件的压缩与解 ...

  6. autocad java api_在java中实现 AutoCAD api

    因为在项目中需要从autoCAD 的dwg文件中提取标题框中的属性插入到数据库中实现图纸的批量入库. 一开始在网上搜索这方面的资料,其中有一些控件可以脱离autoCAD系统提取的,但都是要收费的.比如 ...

  7. Java中常用的API

    文章目录 前言 一.java.lang String StringBuilder Integer parseXXX Math Object System Throwable Thread Runnab ...

  8. java中的stream基本使用

    java中的stream基本使用 文章目录 java中的stream基本使用 前言 一.Stream流的三类方法 二.生成Stream流的方式 三.Stream流中间操作方法 四.Stream流终结操 ...

  9. 【java中常用的API】

    java中有很多常用的API,它们提供了便捷的使用方法和工具类,让我们来看一看java中常用的API吧. 1.math类: 它包含基本的数字运算方法,如对数.指数.平方根和三角函数等,一般数据类型为d ...

最新文章

  1. JUC重要辅助类(同步组件及锁)
  2. 推荐系统可利用的特征
  3. 无盘服务器 cpu占用,顺网科技网维大师程序占CPU资源多的解决过程
  4. delphi接口带上请求头是什么意思_python接口自动化(二十)--token登录(详解)...
  5. php路由有几种,thinkphp3.2框架的四种路由形式
  6. 案例4-4 Windows消息队列 (25 分)(优先队列的优先级设定)
  7. WinRAR 32位解压缩软件 v5.21 汉化免费版
  8. 这8款黑科技APP,满足你的所有需求,你想不到的照样帮你实现!
  9. 界面开发控件DotNetBar for WPF教程:MobileRibbon快速入门指南
  10. G-Dezender批量解密
  11. 远程办公——如何在外远程控制家里/公司的电脑,利用cpolar内网穿透
  12. 博弈论中SG函数的解释与运用
  13. 微信的那个老外产品经理,又写了一篇《中国移动应用设计趋势》
  14. mysql中rtrim的用法,MySQL RTRIM()用法及代码示例
  15. QT5.9用自定义字体修改qlabel字体、大小以及颜色
  16. 2020双周训练训练日志
  17. Spark 中 JVM 内存使用及配置详情、spark报错与调优、Spark内存溢出OOM异常
  18. 2008年超级计算机排名,2008年9月16日,我国首台超百万亿次超级计算机曙光5000A在天津下...
  19. 穿越鸿蒙电视剧,7部“爆款”穿越甜宠剧,你若一部都没看过,那是真落伍了!...
  20. LINUX下ORACLE表空间及用户创建

热门文章

  1. Ae效果控件快速参考:生成
  2. windows 自动锁屏
  3. Linux nohup 命令
  4. 最大权闭合子图(RMRC2017 Open-Pit Mining)
  5. 网线接口和电话线接口的区别
  6. Matlab 图像分割 (阈值处理)
  7. 软件开发中的破窗效应
  8. 传奇私服脚本解密器的研究
  9. vue3之带表情包的输入框
  10. 搜狗回应“统计加班时长裁员”;多家国产浏览器限制访问996.ICU;波音推迟737 Max软件修正丨Q新闻...