精细篇Java8强大的stream API接口大全(代码优雅之道)
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特点
- stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果。
- stream不会改变数据源,通常情况下会产生一个新的集合或一个值。
- 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接口大全(代码优雅之道)相关推荐
- Java8新特性(二)——强大的Stream API
一.强大的Stream API 除了Lambda表达式外,Java8另外一项重大更新便是位于java.util.stream.*下的Stream API Stream 是 Java8 中处理集合的关键 ...
- vue项目:(全局变量设置与调用)API接口封装 - 代码篇
vue项目,如何将"API接口" 封装为"全局变量" ? 1. API全局配置文件[global.vue文件] <template><div& ...
- java 朋友圈分享接口_微信发朋友圈api接口调用代码
微信发朋友圈api接口调用代码,推送微信朋友圈.发朋友圈 /** * 触发推送朋友圈列表 * @author wechatno:tangjinjinwx * startTime传秒 * @blog h ...
- 淘宝/天猫/1688拍立淘API接口(以图搜商品API接口,图片搜索API接口,图片搜索商品API接口)代码对接教程
淘宝/天猫/1688拍立淘API接口(以图搜商品API接口,图片搜索API接口,图片搜索商品API接口)代码对接教程如下: 1.公共参数 名称 类型 必须 描述(接口代码教程wx19970108018 ...
- 淘宝天猫开放平台店铺商品发布(新)-淘宝店铺发布API接口流程代码对接说明
淘宝天猫开放平台店铺商品发布(新)-淘宝店铺发布API接口,天猫店铺发布API接口,oAuth2.0店铺发布接口,店铺商品API接口,店铺商品接口发布API接口流程代码对接说明: 公共参数 名称 类型 ...
- php实现手机归属地的查询、,PHP实现手机归属地查询API接口实现代码
我们经常会开发一些行业分类的网站,这个时候我们需要显示手机归属这个功能,这个时候我们找了很多API接口的地址,但是都不如人意,那么PHP实现手机归属地查询API接口实现代码,大家清楚吗?一起去看看爱站 ...
- 微信ipad安卓协议,微信开发API接口大全
微信ipad安卓协议,微信开发API接口大全 目前市面上用于微信个人号的所有API协议,主要包括 web版微信协议, ipad协议 , pc微信协议/mac协议 , hook pc版微信 , hook ...
- 定制电竞比分网LOL英雄联盟数据API接口调用代码
定制电竞比分网LOL英雄联盟数据API接口调用代码 GET /api/result/lol 说明 该接口为LOL英雄联盟API接口,主要用来拉取比赛结果数据 当每一局比赛结束时,破晓字节电竞数据API ...
- stream of java_java8新特性之强大的Stream API
Stream API Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作. 使用Stream API 对集合数据进行操作, ...
最新文章
- redmine的知识库插件-Redmine Knowledgebase plugin,程序员们的知识需要管理
- python怎么批量处理数据的优点_Python数据处理干货,一文带你深入理解pandas的批量处理方式...
- oppoJava面试题,java声明全局变量的关键字
- Android Camera调用流程
- Mac清理软件为苹果系统迅速减压
- 吴恩达课程及视频笔记汇总
- 用深度强化学习玩atari游戏_深度强化学习从入门到大师:以刺猬索尼克游戏为例讲解PPO(第六部分)...
- 机器学习第2课:单变量线性回归(Linear Regression with One Variable)
- word文件怎么压缩?
- ThingJS学习笔记
- ffmpeg mov 转 mp4
- 读 Paxos 到 ZooKeeper ¥ 50大洋
- 老板要我开发一个OA多级审批流(干货满满)
- Rabbit基本概念详细介绍
- spring interation学习-01发送jms消息
- linux指令buster是什么,FGO三类战斗指令卡有什么用 合理利用手中指令卡
- linux驱动:二、LED灯驱动编写
- SDUT ACM 多项式求和(基于C语言)
- socket通信之bind函数
- 拆解 米家扫地机器人_小米米家机器人值得买吗?小米米家扫地机器人拆解图解...
热门文章
- 信息学奥赛一本通(1400:统计单词数)
- 松鼠聚会(洛谷-P3964)
- 最长公共子上升序列(信息学奥赛一本通-T1306)
- 3 MIGO采购订单收货报错-表T169P,表目S001不存在
- Debian、Ubuntu源码编译制作安装包(二)
- 安卓系统分屏相关修改思路
- android中viewpager+fragment,ViewPager和Fragment一篇就够了
- spring boot html乱码,Spring-boot 字符集设置 解决乱码方案
- shell正则表达式去除注释行
- mariadb mysql同步_MySQL(Mariadb)主从同步基础