一、stream 介绍(抄录一波)

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+

以上的流程转换为 Java 代码为:

List<Integer> transactionsIds =
widgets.stream().filter(b -> b.getColor() == RED).sorted((x,y) -> x.getWeight() - y.getWeight()).mapToInt(Widget::getWeight).sum();

二、案列编写 动手写一遍或者运行一下基本就学会啦

1.创建案例需要使用的实体

public class User {private String name;private int  salary;private String address;private int age;private String sex;private String province;private String city;private String area;public User(String name, int salary, int age, String sex, String province, String city, String area) {this.name = name;this.salary = salary;this.age = age;this.sex = sex;this.province = province;this.city = city;this.area = area;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", salary=" + salary +", address='" + address + '\'' +", age=" + age +", sex='" + sex + '\'' +'}';}/*** 判断两个对象是否相同 默认是判断对象的所有属性是否全部相同* 重写单独属性equals和hashCode* 只要此属性的值相同,则认为两个对象就是相同的* @param o* @return*/@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;User user = (User) o;return Objects.equals(name, user.name);}@Overridepublic int hashCode() {return Objects.hash(name);}}

2.foreach/find/match的用法

@SpringBootTest
class StreamApplicationTests {List<User> initUserList(){List<User> list = new ArrayList<>();list.add(new User("xiaoHu", 150000,  24, "man","Henan","Zhengzhou","Erqi"));list.add(new User("LetMe", 160000,  27, "man","Zhejiang","Hangzhou","Xihu"));list.add(new User("Mlxg", 170000,  26, "man","Shandong","Jinan","Qianfoshan"));list.add(new User("xiaoMing", 160000,  25, "man","Jiangsu","Nanjing","Yuhuatai"));list.add(new User("Miss", 180000,  18, "women","Henan","Zhoukou","chuanhuiqu"));list.add(new User("Uzi", 200000, 23, "man","Shandong","Qingdao","Laoshan"));return list;}List<User> initUserList2(){List<User> list = new ArrayList<>();list.add(new User("xiaoHu", 150000,  24, "man","Henan","Zhengzhou","Erqi"));list.add(new User("Gala", 160000,  27, "man","Zhejiang","Hangzhou","Xihu"));list.add(new User("Wei", 170000,  26, "man","Shandong","Jinan","Qianfoshan"));list.add(new User("xiaoMing", 160000,  25, "man","Jiangsu","Nanjing","Yuhuatai"));list.add(new User("YuShuang", 180000,  18, "women","Henan","Zhoukou","chuanhuiqu"));list.add(new User("Cryin", 200000, 23, "man","Shandong","Qingdao","Laoshan"));return list;}@Test //(foreach/find/match)void streamForeach() {List<User> users = initUserList();//队员薪资大于160000的打印出来信息users.stream().filter(u->u.getSalary()>160000).forEach(System.out::println);//队员薪资大于160000的第一个用户的信息Optional<User> first = users.stream().filter(u -> u.getSalary() > 160000).findFirst();//队员薪资大于160000的任意一个用户信息Optional<User> any = users.stream().filter(u -> u.getSalary() > 160000).findAny();System.out.println("薪资大于160000的第一个用户的信息" + first.get());System.out.println("薪资大于160000的任意一个用户信息" + any.get());}
}

输出结果

User{name='Mlxg', salary=170000, address='null', age=26, sex='man'}
User{name='Miss', salary=180000, address='null', age=18, sex='women'}
User{name='Uzi', salary=200000, address='null', age=23, sex='man'}
薪资大于160000的第一个用户的信息User{name='Mlxg', salary=170000, address='null', age=26, sex='man'}
薪资大于160000的任意一个用户信息User{name='Mlxg', salary=170000, address='null', age=26, sex='man'}

3.筛选(filter) 并形成新的集合。形成新集合依赖collect

@Test //筛选(filter) 并形成新的集合。形成新集合依赖collectvoid streamFilter(){List<User> users = initUserList();//队员年龄大于25岁的人的集合Collection<User> collect = users.stream().filter(u -> u.getAge() > 25).collect(Collectors.toList());System.out.println("队员年龄大于25岁的人的集合:"+collect);}

输出:

队员年龄大于25岁的人的集合:[User{name='LetMe', salary=160000, address='null', age=27, sex='man'}, User{name='Mlxg', salary=170000, address='null', age=26, sex='man'}]

4.映射map

 @Test //映射mapvoid streamMap(){List<User> users = initUserList();//队员年龄大于25岁人的姓名的集合List<String> collect = users.stream().filter(u -> u.getAge() > 25).map(User::getName).collect(Collectors.toList());//将队员所有人名字改成大写List<String> collect1 = users.stream().map(User::getName).map(String::toUpperCase).collect(Collectors.toList());System.out.println("队员年龄大于25岁人的姓名的集合:"+collect);System.out.println("将队员所有人名字改成大写"+collect1);}

输出:

队员年龄大于25岁人的姓名的集合:[LetMe, Mlxg]
将队员所有人名字改成大写[XIAOHU, LETME, MLXG, XIAOMING, MISS, UZI]

5.归约(reduce)是把一个流缩减成一个值,能实现对集合求和等

@Test //归约(reduce)是把一个流缩减成一个值,能实现对集合求和等void streamReduce(){List<User> users = initUserList();//队员所有人的薪资之和Optional<Integer> reduce = users.stream().map(User::getSalary).reduce(Integer::sum);System.out.println("队员所有人的薪资之和"+reduce.get());//队员最高薪资Optional<Integer> reduce1 = users.stream().map(User::getSalary).reduce(Integer::max);System.out.println("队员最高薪资"+reduce1.get());}

输出:

队员所有人的薪资之和1020000
队员最高薪资200000

6.collect,收集,可以说是内容最繁多、功能最丰富的部分了。从字面上去理解,就是把一个流收集起来,最终可以是收集成一个值也可以收集成一个新的集合

 @Test //collect,收集,可以说是内容最繁多、功能最丰富的部分了。从字面上去理解,就是把一个流收集起来,最终可以是收集成一个值也可以收集成一个新的集合void streamCollect() throws JsonProcessingException {List<User> users = initUserList();//队员是河南人的集合List<User> heNan = users.stream().filter(u -> u.getProvince().equals("Henan")).collect(Collectors.toList());System.out.println("队员是河南人的集合"+heNan);//大于25岁的队员Map<String, User> collect = users.stream().filter(x -> x.getAge() > 25).collect(Collectors.toMap(User::getName, p -> p));String s = new ObjectMapper().writeValueAsString(collect);System.out.println("大于21岁的队员"+s);}

输出:

队员是河南人的集合[User{name='xiaoHu', salary=150000, address='null', age=24, sex='man'}, User{name='Miss', salary=180000, address='null', age=18, sex='women'}]
大于21岁的队员{"Mlxg":{"name":"Mlxg","salary":170000,"address":null,"age":26,"sex":"man","province":"Shandong","city":"Jinan","area":"Qianfoshan"},"LetMe":{"name":"LetMe","salary":160000,"address":null,"age":27,"sex":"man","province":"Zhejiang","city":"Hangzhou","area":"Xihu"}}

PS:ObjectMapper()对象是实现json的核心 当没有导入json依赖时 可以从这个类

7.统计

  @Test //统计void streamCount(){//队员人数List<User> users = initUserList();long count = users.stream().count();System.out.println("队员人数"+count);//队员平均工资Double collect = users.stream().collect(Collectors.averagingInt(u -> u.getSalary()));Double collect1 = users.stream().collect(Collectors.averagingDouble(User::getSalary));System.out.println("队员平均工资"+collect+"====队员平均工资"+collect1);//队员最大薪资Optional<Integer> collect2 = users.stream().map(User::getSalary).collect(Collectors.maxBy(Integer::compare));System.out.println("队员最大薪资"+collect2.get());}

输出:

队员人数6
队员平均工资170000.0====队员平均工资170000.0
队员最大薪资200000

8.分组

public void streamGroup() throws JsonProcessingException {List<User> users = initUserList();// 将队员按省份分组Map<String, List<User>> collect = users.stream().collect(Collectors.groupingBy(User::getProvince));System.out.println(collect);// 将队员按省份分组 再按性别分组Map<String, Map<String, List<User>>> collect1 = users.stream().collect(Collectors.groupingBy(User::getProvince, Collectors.groupingBy(User::getSex)));String s = new ObjectMapper().writeValueAsString(collect1);System.out.println(s);}

输出:

{Zhejiang=[User{name='LetMe', salary=160000, address='null', age=27, sex='man'}], Henan=[User{name='xiaoHu', salary=150000, address='null', age=24, sex='man'}, User{name='Miss', salary=180000, address='null', age=18, sex='women'}], Jiangsu=[User{name='xiaoMing', salary=160000, address='null', age=25, sex='man'}], Shandong=[User{name='Mlxg', salary=170000, address='null', age=26, sex='man'}, User{name='Uzi', salary=200000, address='null', age=23, sex='man'}]}
{"Zhejiang":{"man":[{"name":"LetMe","salary":160000,"address":null,"age":27,"sex":"man","province":"Zhejiang","city":"Hangzhou","area":"Xihu"}]},"Henan":{"man":[{"name":"xiaoHu","salary":150000,"address":null,"age":24,"sex":"man","province":"Henan","city":"Zhengzhou","area":"Erqi"}],"women":[{"name":"Miss","salary":180000,"address":null,"age":18,"sex":"women","province":"Henan","city":"Zhoukou","area":"chuanhuiqu"}]},"Jiangsu":{"man":[{"name":"xiaoMing","salary":160000,"address":null,"age":25,"sex":"man","province":"Jiangsu","city":"Nanjing","area":"Yuhuatai"}]},"Shandong":{"man":[{"name":"Mlxg","salary":170000,"address":null,"age":26,"sex":"man","province":"Shandong","city":"Jinan","area":"Qianfoshan"},{"name":"Uzi","salary":200000,"address":null,"age":23,"sex":"man","province":"Shandong","city":"Qingdao","area":"Laoshan"}]}}

9.joining

  @Test //joining 将每个队员的名字连接起来public void streamJoining(){List<User> users = initUserList();//将每个队员的名字连接起来String collect = users.stream().map(User::getName).collect(Collectors.joining("-"));System.out.println("将每个队员的名字连接起来"+collect);}

输出:

将每个队员的名字连接起来xiaoHu-LetMe-Mlxg-xiaoMing-Miss-Uzi

10.sort排序

 @Test//sortvoid streamSorted(){List<User> users = initUserList();//工资由低到高List<User> collect = users.stream().sorted(Comparator.comparing(User::getSalary)).collect(Collectors.toList());//工资由低到高 工资相等时 再按年龄由低到高List<String> collect1 = users.stream().sorted(Comparator.comparing(User::getSalary).reversed().thenComparing(User::getAge)).map(User::getName).collect(Collectors.toList());System.out.println("工资由低到高:"+collect);System.out.println("工资由低到高 工资相等时 再按年龄由低到高"+collect1);}

输出:

工资由低到高:[User{name='xiaoHu', salary=150000, address='null', age=24, sex='man'}, User{name='LetMe', salary=160000, address='null', age=27, sex='man'}, User{name='xiaoMing', salary=160000, address='null', age=25, sex='man'}, User{name='Mlxg', salary=170000, address='null', age=26, sex='man'}, User{name='Miss', salary=180000, address='null', age=18, sex='women'}, User{name='Uzi', salary=200000, address='null', age=23, sex='man'}]
工资由低到高 工资相等时 再按年龄由低到高[Uzi, Miss, Mlxg, xiaoMing, LetMe, xiaoHu]

10.distinct limit skip

   @Test//distinct limit skipvoid streamDistinct(){List<User> users = initUserList();List<User> users1 = initUserList2();//两个队队员的总人数List<String> collect = Stream.concat(users.stream(), users1.stream()).distinct().map(User::getName).collect(Collectors.toList());System.out.println("两个队队员的总人数"+collect);//两个队伍薪资最高的前四名List<String> collect1 = Stream.concat(users.stream(), users1.stream()).distinct().collect(Collectors.toList()).stream().sorted(Comparator.comparing(User::getSalary).reversed()).limit(4).map(User::getName).collect(Collectors.toList());System.out.println("两个队伍薪资最高的前四名"+collect1);//跳过两个队伍薪资最高的前四名前两人List<String> collect2 = collect1.stream().skip(2).collect(Collectors.toList());System.out.println("跳过两个队伍薪资最高的前四名前两人"+collect2);}

输出:

两个队队员的总人数[xiaoHu, LetMe, Mlxg, xiaoMing, Miss, Uzi, Gala, Wei, YuShuang, Cryin]
两个队伍薪资最高的前四名[Uzi, Cryin, Miss, YuShuang]
跳过两个队伍薪资最高的前四名前两人[Miss, YuShuang]

Java8 stream流式表达式用法相关推荐

  1. [编程] Java8 Stream(流式计算) 常见的一些用法汇总

    前提:以下基于 List<Student> 列表进行举例,大家实际使用进行举一反三即可.大同小异,Java8 的流式计算功能很强大,需要大家实际应用中逐渐挖掘更高级的用法. Student ...

  2. java8/Stream流式计算从入门到精通/函数式编程实战

    摘要:Stream流式计算,本文讲解了Stream流式计算的概念,具体的使用步骤以及源码实现,最后讲解了使用Stream过程中需要注意的事项.Stream在公司项目中被频繁使用,在性能优化上具有广泛的 ...

  3. Java8 Stream流式操作接口详解

    stream是用于集合使用的流式操作,可使用collection.stream获取流 default Stream<E> stream() {return StreamSupport.st ...

  4. Java8 Stream流式编程,极大解放你的生产力!

    java8自带常用的函数式接口 Predicate<T> boolean test(T t) 传入一个参数返回boolean值 Consumer<T> void accept( ...

  5. Java8 Stream流的iterate用法总结

    Stream.iterate(final T seed, final UnaryOperator f) 作用:指定一个常量seed,生成从seed到常量f(由UnaryOperator返回的值得到)的 ...

  6. Java8新特性之Stream流式编程

    特地感谢鲁班大叔的分享,原学习地址:Java8 Stream流式编程爱 撸码就是快,流式编程好 代码传家宝 以下是学习过程整理的笔记 1.简介 Stream 流处理,首先要澄清的是 java8 中的 ...

  7. Java8 的 Stream 流式操作之王者归来

    相对于Java8之前的Java的相关操作简直是天差地别,Java8 的流式操作的出现,也很大程度上改变了开发者对于Java的繁琐的操作的印象,从此,Java也走向了函数式编程的道路! 1 流的创建 1 ...

  8. Java8的 Stream 流的各种用法

    Java8 的 Stream 流的各种用法 什么是Stream 1. Stream可以由数组或集合创建,对流的操作分为两种 2. Stream的特性 3. Stream可以通过集合数组创建 4. st ...

  9. Lambda表达式和Stream流式编程

    写在前面 IDEA都默认是jdk11了,我这还写着jdk8的新特性呢,惭愧惭愧.其实在学校的时候,基本没咋用过Lambda表达式和Stream流式编程,但是在实习的时候,发现公司的代码好多这样写的,没 ...

最新文章

  1. wpf窗口向左向上_PaperWM:GNOME 下的平铺窗口管理
  2. pandas删除dataframe列名称中包含特定字符串的数据列(dropping columns contains specifiec substring in dataframe)
  3. SQL:判断字符类型是否为数字
  4. mysql存储过程1267_mysql存储过程一例
  5. 反问疑问_句子练习大全(反问、疑问、设问、病句等练习)
  6. 实例22:python
  7. 审计风险控制流程的起点_【经验分享】审计整改流程体系的优化措施
  8. 网络学习(三十三)Windows Server 2003 DFS(分布式文件系统)
  9. php paypal ipn,PHP 开发详解:PayPal Instant Payment Notification (IPN)
  10. pano2vr 6.0转换为html,全景图转换器(Pano2VR)
  11. 成都传智播客七月开班。你HOLD住了吗?
  12. raspberry OS buster InRelease: The following signatures couldn‘t be verified
  13. python selenium爬虫 不打开网页 不打开浏览器
  14. 传奇人物《周兴和》书连载30 成功背后的陷阱
  15. 一些程序员都关注的公众号
  16. asp.net944-网络游戏虚拟物品交易平台设计与实现#毕业设计
  17. 吴恩达机器学习ex2-logistic regression python版
  18. MSP432驱动舵机串口输出角度
  19. 在这个特殊的日子里,我用最真挚的心意,为母亲送上了最温暖的祝福。
  20. python爬虫:爬取多页斗鱼颜值图片 并且下载到本地

热门文章

  1. Linux Ubuntu NFS 调试,Arm 挂载命令
  2. Benchmarking Lane-changing Decision-making for Deep Reinforcement Learning
  3. windows server2008 R2 无法验证此程序发布者,导致VMware tool 安装失败
  4. oracle ebs mrp提前期,EBS-MRP提前期.doc
  5. 【转】售前的成长故事(19篇)
  6. Java8-惰性求值
  7. android 启动app过程,应用程序进程启动过程
  8. 什么是范数(norm)?以及L1,L2范数的简单介绍
  9. Javascript 新历转旧历|阳历转阴历|公历转农历算法代码
  10. H.264 入门篇 - 00 (简介)