Java 8 新特性-Stream更优雅的处理集合入门
Java 8 新特性之——Stream
一. 简单介绍
Stream是Java 8提出了的一种新的对集合对象功能的增强。它集合Lambda表达式,对集合提供了一些非常便利,高效的操作,使得代码具有非常高的可读性,优雅性!!举个例子来说,它就像一个流水线操作,对输入流水线的东西(水果)进行一系列加工处理,最后获取到我们需要的某种特殊的水果(没有洗过的苹果)。
- Stream提供了对集合的便捷化处理方式
- 声明式编程的思想
- 代码更加优雅,简洁,不信往下看→_→
来个例子来看看Stream风格
上海从今年7月1号开始,进行了史无前例的垃圾分类,先看个图图,下图是上海最近流行的挎包(捂脸笑哭),怕不怕,哈哈。
闲话不多说,进入正题,现在需要将一堆垃圾
List<Garbage> garbages分类处理。
- 使用了Stream的代码风格
//有一堆没分类的垃圾
List<Garbage> garbage = new ArrayList<>();
//通过 Java 8 提供的流优雅的处理下,瞧好喽
List<Garbage> 干垃圾 = garbage.stream() //1. 垃圾倒出来,放到流水线
.filter(x -> "挑出有害垃圾") //2. 挑出有害垃圾
.filter(x -> "挑出可回收垃圾") //3. 挑出可回收垃圾
.filter(x -> "挑出有害垃圾") //4. 挑出有害垃圾
.collect(Collectors.toList()); //5. 把剩下的干垃圾装到干垃圾桶
/** 上面是不是非常优雅呢 **/
二. Stream 的操作流程
Stream的所有操作分为三个阶段,【创建】>> 【中间操作】>> 【终端操作】
1. Stream 的【创建】
方式一
list.stream()
//通过List集合创建
List<String> list = Arrays.asList("1", "2", "3");
//list.stream()
Stream<String> stream = list.stream();
方式二
Stream.of()
//直接通过指定的元素创建
Stream<String> stream = Stream.of("1", "2", "3");
//通过数组Array
String[] arrays = {"a", "b", "c"};
Stream<String> stream = Stream.of(arrays);
//和上面区别不大
Stream<String> stream1 = Arrays.stream(arrays);
其他
数值流的操作
对于基本数值型,目前有三种对应的包装类型 Stream:
IntStream.of(new int[]{1, 2, 3}).forEach(System.out::println);
IntStream.range(1, 3).forEach(System.out::println);
IntStream.rangeClosed(1, 3).forEach(System.out::println);
2. Stream的流水线操作【中间操作】
下面式常用的中间操作
| Stream Operation | Goal | Input |
|---|---|---|
| filter | filter 方法用于通过设置的条件过滤出元素。 | 条件(返回布尔值)Predicate |
| map | map 方法用于映射每个元素到对应的结果 | 可以是一个功能 Function |
| limit | limit 方法用于获取指定数量的流 | int值 |
| sorted | sorted 方法用于对流进行排序 | Comparator |
| distinct | 去除重复 | -- |
| parallel | parallelStream 是流并行处理程序的代替方法 | -- |
- filter统计空字符串的个数
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
int count = strings.stream().filter(string -> string.isEmpty()).count()
- map 使用 map 输出了元素对应的平方数
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
// 获取对应的平方数
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
- limit使用 limit 方法打印出 10 条数据
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
- sorted使用 sorted 方法对输出的 10 个随机数进行排序
Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);
- distinct使用 distinct 对元素进行去重
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
numbers.stream().distinct().forEach(System.out::println);
- parallel 使用 parallelStream 来输出空字符串的数量
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
int count = strings.parallelStream().filter(string -> string.isEmpty()).count();
3. 【终端操作】
| Stream Operation | Goal | Input Or Output |
|---|---|---|
| forEach | 遍历元素 | 其他操作 |
| count | 统计元素个数 | -- |
| collect | 聚合操作 | -- |
- forEach遍历打印
Stream.of("a", "b", "c").forEach(System.out::println);
- count统计'a'的数量
long count = Stream.of("a", "b", "c", "a").filter(x -> "a".equals(x)).count();//2
- collect聚合
// 1. 聚合转成List
List<String> list1 = stream.collect(Collectors.toList());
List<String> list2 = stream.collect(Collectors.toCollection(ArrayList::new));
// 2. 聚合转成Set
Set set1 = stream.collect(Collectors.toSet());
Stack stack1 = stream.collect(Collectors.toCollection(Stack::new));
// 3. 聚合转成String
String str = stream.collect(Collectors.joining()).toString();
// 4. ···其他
1. 循环list中的所有元素然后删除重复
/**
* 循环list中的所有元素然后删除重复
*
* @param list 待去重的list
* @return 去重后的list
*/
public static List<StaffResponse> removeDuplicate(List<StaffResponse> list) {
for (int i = 0; i < list.size() - 1; i++) {
for (int j = list.size() - 1; j > i; j--) {
if (list.get(j).getStaffNo().equals(list.get(i).getStaffNo())) {
list.remove(j);
}
}
}
return list;
}
2. 利用java8新特性去重参考原文链接
//list集合中根据userName去重
List<User> lists = lists.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getUsrName))), ArrayList::new));
3. 排序 参考原文链接
List<PromotionForHomeDto> list = promotionBasicDao.
list(new WherePrams().orderBy("create_time desc"));
list = list.stream().sorted(Comparator.comparing(PromotionForHomeDto::getCreateTime))
.collect(Collectors.toList());
三. 简单说下声明式编程
小故事:早上刚上班,经理找到大胖说:“大胖啊,咱们下去去聚餐,软件园旁边有好几家不错的餐馆,如巫山烤鱼、海底捞、大鸭梨,你到大众点评调查一下,也问问去过的同事,看看哪家的口碑好。我们有14个人,预定一张大桌子,然后用滴滴约4辆车,每辆车坐3~4人,我们会在11点半出发”。
如果经理是程序员,大胖是计算机,这就是典型的命令式编程。
实际上,现实中一般是经理对大胖说:“大胖啊,我给你交代一件事,咱们下午要聚餐,你在软件园旁边找一家合适的餐馆,我们有14个人,11点半出发”。这种就是声明式编程
1. 声明式编程最知名的就是我们都熟悉的SQL
SELECT stu.id, stu.name, ss.score
FROM student stu, student_score ss
WHERE stu.id = ss.id
AND ss.score > 80
2. 用Java也来举个例子
有一个学生列表,计算出年龄小于18岁的学生数量
传统命令式编程
//声明一个计数器,遍历学生集合,如果学生年龄小于18岁,计数器+1
int count = 0;
Iterator<Student> iter = students.iterator();
while(iter.hasNext()) {
Student s = iter.next();
if (s.getAge < 18) {
count++;
}
}
声明式编程
//过滤学生构成的流(Stream),只把年龄小于18岁的留下,然后做个统计。
int count = students.stream()
.filter(s -> s.getAge() < 18)
.count();
声明式编程也是一种高度的抽象,我只告诉你我要干什么,至于怎么干,我Don't care
Java 8 新特性-Stream更优雅的处理集合入门的更多相关文章
- 再来看看Java的新特性——Stream流
半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...
- JDK-7新特性,更优雅的关闭流-java try-with-resource语句使用
前言 公司最近代码质量整改,需要对大方法进行调整,降低到50行以下,对方法的深度进行降低,然后有些文件涉及到流操作,很多try/catch/finally语句,导致行数超出规范值,使用这个语法可以很好 ...
- Java 8 新特性---------Stream
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象 ...
- JAVA 8 新特性Stream初体验
什么是 Stream? Stream(流)是一个来自数据源的元素队列并支持聚合操作 <strong元素队列< strong="">元素是特定类型的对象,形成一个队 ...
- Java 8新特性--Stream API
Java 8 API添加了一个新的抽象称为流Stream,以一种声明的方式处理数据,可以极大提高程序员的生产力,写出高效.干净.简洁的代码.这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可 ...
- Java 12 新特性介绍,快来补一补
Java 12 早在 2019 年 3 月 19 日发布,它不是一个长久支持(LTS)版本.在这之前我们已经介绍过其他版本的新特性,如果需要可以点击下面的链接进行阅读. Java 11 新特性介绍 J ...
- Java 8 新特性——Lambdas 表达式
本文内容 引入 测试数据 collect(toList()) map filter flatMap max 和 min reduce 整合操作 参考资料 Java 8 对核心类库的改进主要包括集合类的 ...
- Java 8新特性之旅:使用Stream API处理集合
在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda ...
- java新特性stream
java新特性stream,也称为流式编程. 在学习stream之前先了解一下java内置的四大函数 第一种函数式函数,后面是lambda表达式写法 /*Function<String,Inte ...
随机推荐
- windows 的使用 —— 注册表(软件的安装和卸载)
win + r(run):输入 regedit(register edit)进入: 1. 网络连接 比如一些 vpn 安装之后,会对网络连接进行一定的修改,这样在 vpn 工具删除之后,仍然无法消除修 ...
- 机器学习: DeepDreaming with TensorFlow (一)
在TensorFlow 的官网上,有一个很有趣的教程,就是用 TensorFlow 以及训练好的深度卷积神经(GoogleNet)网络去生成一些有趣的pattern,通过这些pattern,可以更加深 ...
- ASP.NET Core Razor 视图起始页 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core Razor 视图起始页 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 视图起始页 上一章节中我们介绍了布局视图, ...
- 转义及编码(\u, \x)
首先前面的 \表示转义, \x:只是 16 进制的意思,后边跟两位,则表示单字节编码: \d:十进制:\o:八进制: 对于 \xaa ⇒ chr(0xaa) ⇒ chr(16*a+a) \u:unic ...
- vb.net版本房收费系统改造
房费制开始重建的最终版本. 前几天.刚刚看完三层的视频,在视频中具体的解说了一个登录功能.天真的我,当时以为三层结构是那么的简单,所以我草草地做完总结之后,就非常快就開始机房收费系统的重构了.但是谁想 ...
- Bootstrap 图片形状
@{ Layout = null;}<!DOCTYPE html><html><head> <meta name="viewport&q ...
- ADB 基础命令使用
1.adb shell(>=2个设备显示:error: more than one device/emulator,仅连接一个设备可用) adb -d shell 只运行在真实设备中 adb - ...
- QT的进程与线程(cmd /c的写法)
该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处! 导语 在前面的几节内容中讲解了Qt网络编程的一些基本内容,这一节来看一下在Qt中进程和线程的基本应 ...
- linux下计划任务学习记录
0x01 计划任务简介 linux 中计划任务主要分为”循环执行”和”只执行一次”两种,分别对应的时 crond 服务 和 atd 服务: 0x02 只执行一次的计划任务 0x02.1 atd 服务说 ...
- WPF 调用API修改窗体风格实现真正的无边框窗体
原文:WPF 调用API修改窗体风格实现真正的无边框窗体 WPF中设置无边框窗体似乎是要将WindowStyle设置为None,AllowTransparency=true,这样才能达到WinForm ...