Stream API大全

  • 前言
  • 一、Stream特点
  • 二、Stream实例化方式
    • 2.1 通过集合
    • 2.2 通过数组
    • 2.3 通过Stream的of方法
    • 2.4 通过无限流
  • 三、Stream的API方法
    • 3.1 filter
    • 3.2 limit
    • 3.3 skip
    • 3.4 distinct
    • 3.5 map
    • 3.6 排序
    • 3.7 匹配与查找
      • 1、allMatch
      • 2、anyMatch
      • 3、noneMatch
      • 4、findFirst
      • 5、findAny
      • 6、count
      • 7、max
      • 8、min
    • 3.8 归约
    • 3.9 收集 collect
  • 总结

前言

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。


一、Stream特点

  1. stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果。
  2. stream不会改变数据源,通常情况下会产生一个新的集合或一个值。
  3. stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。

二、Stream实例化方式

2.1 通过集合

 public static List<Employee> getEmployeeDataList(){List<Employee> list = new ArrayList<>();list.add(new Employee(1,"张三",20,8500D,1));list.add(new Employee(2,"李四",18,600D,1));list.add(new Employee(3,"王五",21,5500D,3));list.add(new Employee(4,"小白",30,8500D,2));return list;}public static void main(String[] args) {List<Employee> employees = getEmployeeDataList();// 返回一个顺序流 (按照集合顺序获取)Stream<Employee> stream = employees.stream();// 返回一个并行流 (类似于线程去获取数据,无序)Stream<Employee> parallelStream = employees.parallelStream();
}

2.2 通过数组

public static void main(String[] args) {int[] arr = new int[]{1,2,3,4,5,6};IntStream intStream = Arrays.stream(arr);Employee e1 = new Employee(1, "张三", 20, 8500D, 1);Employee e2 = new Employee(2, "李四", 18, 600D, 1);Employee[] employees = new Employee[]{e1,e2};Stream<Employee> stream = Arrays.stream(employees);
}

2.3 通过Stream的of方法

public static void main(String[] args) {Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6);
}

2.4 通过无限流

public static void main(String[] args) {// 生成偶数Stream.iterate(0,t->t+2).limit(10).forEach(System.out::println);// 10个随机数Stream.generate(Math::random).limit(10).forEach(System.out::println);
}

三、Stream的API方法

3.1 filter


筛选工资大于8000的员工:

public static void main(String[] args) {List<Employee> employees = getEmployeeDataList();Stream<Employee> stream = employees.stream();stream.filter(e -> e.getSalary() > 8000).forEach(t->{System.out.println("工资大于八千的员工->>>"+t);});
}

3.2 limit

输出集合元素数量

public static void main(String[] args) {List<Employee> employees = getEmployeeDataList();employees.stream().limit(3).forEach(t-> System.out.println("输出集合元素数量->>>"+t));
}

3.3 skip

过滤掉前面的2个元素

public static void main(String[] args) {List<Employee> employees = getEmployeeDataList();employees.stream().skip(2).forEach(t-> System.out.println("过滤掉前面的2个元素->>>"+t));
}

3.4 distinct

集合去重

public static void main(String[] args) {List<Employee> list = new ArrayList<>();list.add(new Employee(1,"张三",20,8500D,1));list.add(new Employee(1,"张三",20,8500D,1));list.add(new Employee(1,"张三",20,8500D,1));list.add(new Employee(1,"张三",20,8500D,1));list.add(new Employee(1,"张三",20,8500D,1));list.stream().distinct().forEach(t-> System.out.println("集合去重->>>"+t));
}

3.5 map

大小写转换

public static void main(String[] args) {List<String> list = Arrays.asList("a", "b", "c", "d");list.stream().map(str -> str.toUpperCase(Locale.ROOT)).forEach(t-> System.out.println("大小写转换->>>"+t));
}


获取员工姓名大于3的员工姓名

public static void main(String[] args) {// 获取员工姓名大于3的员工姓名List<Employee> list = getEmployeeDataList();Stream<String> nameStream = list.stream().map(Employee::getName);nameStream.filter(name -> name.length() > 3).forEach(t-> System.out.println("获取员工姓名大于3的员工->>>"+t));
}

3.6 排序

先按照年龄从小到大排序,当年龄一样的时候,按照工资高低进行排序

public static void main(String[] args) {List<Employee> list = getEmployeeDataList();list.stream().sorted((e1,e2)->{int age = Integer.compare(e1.getAge(),e2.getAge());if(age != 0){return age;}else {return Double.compare(e1.getSalary(),e2.getSalary());}}).forEach(System.out::println);
}

3.7 匹配与查找

1、allMatch

allMatch:检查是否匹配所有元素

判断员工年龄是否都大于18岁

public static void main(String[] args) {List<Employee> list = getEmployeeDataList();boolean allMatch = list.stream().allMatch(e -> e.getAge() > 18);System.out.println(allMatch);
}
全部满足返回 true 、否则返回false

2、anyMatch

anyMatch:检查是否至少匹配一个元素

是否存在有员工工资大于8000的

public static void main(String[] args) {List<Employee> list = getEmployeeDataList();boolean anyMatch = list.stream().anyMatch(employee -> employee.getSalary() > 8000);System.out.println(anyMatch);
}
存在一个元素条件满足即可返回true

3、noneMatch

noneMatch:检查是否没有匹配的元素

查询是否有姓张的员工

public static void main(String[] args) {List<Employee> list = getEmployeeDataList();boolean noneMatch = list.stream().noneMatch(employee -> employee.getName().startsWith("张"));System.out.println(noneMatch);
}
返回false,说明有,否则没有

4、findFirst

findFirst:返回第一个元素

public static void main(String[] args) {List<Employee> list = getEmployeeDataList();Optional<Employee> first = list.stream().findFirst();System.out.println(first);
}

5、findAny

findAny:返回当前流中的任意元素

public static void main(String[] args) {List<Employee> list = getEmployeeDataList();Optional<Employee> first = list.parallelStream().findAny();System.out.println(first);
}

6、count

count:返回流中元素的总个数

查询员工工资大于8000的人数

public static void main(String[] args) {List<Employee> list = getEmployeeDataList();long count = list.stream().filter(employee -> employee.getSalary() > 8000).count();System.out.println(count);
}

7、max

max:返回流中的最大值

查询最高的员工工资

public static void main(String[] args) {List<Employee> list = getEmployeeDataList();Stream<Double> doubleStream = list.stream().map(employee -> employee.getSalary());Optional<Double> max = doubleStream.max(Double::compare);System.out.println(max);
}

8、min

min:返回流中的最小值

查询最低的员工工资

 public static void main(String[] args) {List<Employee> list = getEmployeeDataList();Optional<Employee> min = list.stream().min((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()));System.out.println(min);
}

3.8 归约

reduce:可以将流中的元素反复结合起来,得到一个值

求出1到10的总和

public static void main(String[] args) {List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);Integer reduce = list.stream().reduce(0, Integer::sum);System.out.println(reduce);
}
reduce的第一个参数0:代表初始值。


计算公司中所有员工的总和

public static void main(String[] args) {List<Employee> list = getEmployeeDataList();// 先映射取出工资Stream<Double> doubleStream = list.stream().map(Employee::getSalary);Optional<Double> reduce = doubleStream.reduce(Double::sum);System.out.println(reduce);
}

3.9 收集 collect

查找工资大于8000的员工,返回一个list或者set

 public static void main(String[] args) {List<Employee> list = getEmployeeDataList();List<Employee> collect = list.stream().filter(employee -> employee.getSalary() > 8000).collect(Collectors.toList());System.out.println(collect);
}
public static void main(String[] args) {List<Employee> list = getEmployeeDataList();Set<Employee> collect = list.stream().filter(employee -> employee.getSalary() > 8000).collect(Collectors.toSet());System.out.println(collect);
}

总结

完结,好了,以上就是全部内容,能坚持看到这里,你一定会有收获,只要反复的练习一定能写出优雅的stream流,后面的文章我们会继续扩展其他的接口实现。

精细篇Java8强大的stream API接口大全(代码优雅之道)相关推荐

  1. Java8新特性(二)——强大的Stream API

    一.强大的Stream API 除了Lambda表达式外,Java8另外一项重大更新便是位于java.util.stream.*下的Stream API Stream 是 Java8 中处理集合的关键 ...

  2. vue项目:(全局变量设置与调用)API接口封装 - 代码篇

    vue项目,如何将"API接口" 封装为"全局变量" ? 1. API全局配置文件[global.vue文件] <template><div& ...

  3. java 朋友圈分享接口_微信发朋友圈api接口调用代码

    微信发朋友圈api接口调用代码,推送微信朋友圈.发朋友圈 /** * 触发推送朋友圈列表 * @author wechatno:tangjinjinwx * startTime传秒 * @blog h ...

  4. 淘宝/天猫/1688拍立淘API接口(以图搜商品API接口,图片搜索API接口,图片搜索商品API接口)代码对接教程

    淘宝/天猫/1688拍立淘API接口(以图搜商品API接口,图片搜索API接口,图片搜索商品API接口)代码对接教程如下: 1.公共参数 名称 类型 必须 描述(接口代码教程wx19970108018 ...

  5. 淘宝天猫开放平台店铺商品发布(新)-淘宝店铺发布API接口流程代码对接说明

    淘宝天猫开放平台店铺商品发布(新)-淘宝店铺发布API接口,天猫店铺发布API接口,oAuth2.0店铺发布接口,店铺商品API接口,店铺商品接口发布API接口流程代码对接说明: 公共参数 名称 类型 ...

  6. php实现手机归属地的查询、,PHP实现手机归属地查询API接口实现代码

    我们经常会开发一些行业分类的网站,这个时候我们需要显示手机归属这个功能,这个时候我们找了很多API接口的地址,但是都不如人意,那么PHP实现手机归属地查询API接口实现代码,大家清楚吗?一起去看看爱站 ...

  7. 微信ipad安卓协议,微信开发API接口大全

    微信ipad安卓协议,微信开发API接口大全 目前市面上用于微信个人号的所有API协议,主要包括 web版微信协议, ipad协议 , pc微信协议/mac协议 , hook pc版微信 , hook ...

  8. 定制电竞比分网LOL英雄联盟数据API接口调用代码

    定制电竞比分网LOL英雄联盟数据API接口调用代码 GET /api/result/lol 说明 该接口为LOL英雄联盟API接口,主要用来拉取比赛结果数据 当每一局比赛结束时,破晓字节电竞数据API ...

  9. stream of java_java8新特性之强大的Stream API

    Stream API Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作. 使用Stream API 对集合数据进行操作, ...

最新文章

  1. redmine的知识库插件-Redmine Knowledgebase plugin,程序员们的知识需要管理
  2. python怎么批量处理数据的优点_Python数据处理干货,一文带你深入理解pandas的批量处理方式...
  3. oppoJava面试题,java声明全局变量的关键字
  4. Android Camera调用流程
  5. Mac清理软件为苹果系统迅速减压
  6. 吴恩达课程及视频笔记汇总
  7. 用深度强化学习玩atari游戏_深度强化学习从入门到大师:以刺猬索尼克游戏为例讲解PPO(第六部分)...
  8. 机器学习第2课:单变量线性回归(Linear Regression with One Variable)
  9. word文件怎么压缩?
  10. ThingJS学习笔记
  11. ffmpeg mov 转 mp4
  12. 读 Paxos 到 ZooKeeper ¥ 50大洋
  13. 老板要我开发一个OA多级审批流(干货满满)
  14. Rabbit基本概念详细介绍
  15. spring interation学习-01发送jms消息
  16. linux指令buster是什么,FGO三类战斗指令卡有什么用 合理利用手中指令卡
  17. linux驱动:二、LED灯驱动编写
  18. SDUT ACM 多项式求和(基于C语言)
  19. socket通信之bind函数
  20. 拆解 米家扫地机器人_小米米家机器人值得买吗?小米米家扫地机器人拆解图解...

热门文章

  1. 信息学奥赛一本通(1400:统计单词数)
  2. 松鼠聚会(洛谷-P3964)
  3. 最长公共子上升序列(信息学奥赛一本通-T1306)
  4. 3 MIGO采购订单收货报错-表T169P,表目S001不存在
  5. Debian、Ubuntu源码编译制作安装包(二)
  6. 安卓系统分屏相关修改思路
  7. android中viewpager+fragment,ViewPager和Fragment一篇就够了
  8. spring boot html乱码,Spring-boot 字符集设置 解决乱码方案
  9. shell正则表达式去除注释行
  10. mariadb mysql同步_MySQL(Mariadb)主从同步基础