stream of java_Java 8 新特性-Stream更优雅的处理集合入门

Java 8 新特性之——Stream

一. 简单介绍

Stream是Java 8提出了的一种新的对集合对象功能的增强。它集合Lambda表达式,对集合提供了一些非常便利,高效的操作,使得代码具有非常高的可读性,优雅性!!举个例子来说,它就像一个流水线操作,对输入流水线的东西(水果)进行一系列加工处理,最后获取到我们需要的某种特殊的水果(没有洗过的苹果)。

Stream提供了对集合的便捷化处理方式

声明式编程的思想

代码更加优雅,简洁,不信往下看→_→

来个例子来看看Stream风格

上海从今年7月1号开始,进行了史无前例的垃圾分类,先看个图图,下图是上海最近流行的挎包(捂脸笑哭),怕不怕,哈哈。

0b21520b3c9dba1122ddd19913d2b0ea.png

闲话不多说,进入正题,现在需要将一堆垃圾List garbages分类处理。

使用了Stream的代码风格

//有一堆没分类的垃圾

List garbage = new ArrayList<>();

//通过 Java 8 提供的流优雅的处理下,瞧好喽

List 干垃圾 = garbage.stream() //1. 垃圾倒出来,放到流水线

.filter(x -> "挑出有害垃圾") //2. 挑出有害垃圾

.filter(x -> "挑出可回收垃圾") //3. 挑出可回收垃圾

.filter(x -> "挑出有害垃圾") //4. 挑出有害垃圾

.collect(Collectors.toList()); //5. 把剩下的干垃圾装到干垃圾桶

/** 上面是不是非常优雅呢 **/

二. Stream 的操作流程

Stream的所有操作分为三个阶段,【创建】>> 【中间操作】>> 【终端操作】

1. Stream 的【创建】

方式一

list.stream()

//通过List集合创建

List list = Arrays.asList("1", "2", "3");

//list.stream()

Stream stream = list.stream();

方式二

Stream.of()

//直接通过指定的元素创建

Stream stream = Stream.of("1", "2", "3");

//通过数组Array

String[] arrays = {"a", "b", "c"};

Stream stream = Stream.of(arrays);

//和上面区别不大

Stream 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统计空字符串的个数

Liststrings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

// 获取空字符串的数量

int count = strings.stream().filter(string -> string.isEmpty()).count()

map 使用 map 输出了元素对应的平方数

List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

// 获取对应的平方数

List 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 numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

numbers.stream().distinct().forEach(System.out::println);

parallel 使用 parallelStream 来输出空字符串的数量

List 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 list1 = stream.collect(Collectors.toList());

List 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 removeDuplicate(List 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 lists = lists.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getUsrName))), ArrayList::new));

3. 排序 参考原文链接

List list = promotionBasicDao.

list(new WherePrams().orderBy("create_time desc"));

list = list.stream().sorted(Comparator.comparing(PromotionForHomeDto::getCreateTime))

.collect(Collectors.toList());

4. 分组

把一个集合分组(原来集合里的数据顺序会打乱重排列)会默认使用HashMap

List stus...;

Map> group = stus.stream().collect(Collectors.groupingBy(Student::getStudentNo));

解决办法,使用LinkedHashMap分组按之前List的顺序

List stus...;

Map> group = stus.stream().collect(Collectors.groupingBy(Student::getStudentNo, LinkedHashMap::new, Collectors.toList()));

实测例子:

public static void main(String[] args) {

List lists = new ArrayList<>();

lists.add("A");

lists.add("D");

lists.add("C");

lists.add("B");

lists.add("A");

System.out.println("原始列表数据 :" + lists);

Map> collect1 = lists.stream().collect(Collectors.groupingBy(x -> x));

System.out.println("JAVA Stream分组处理完,默认处理:" + collect1);

Map> collect = lists.stream().collect(Collectors.groupingBy(x -> x, LinkedHashMap::new, Collectors.toList()));

System.out.println("JAVA Stream分组处理完,LinkedHashMap:" + collect);

}

4. List转Map

/*

* List -> Map

* 需要注意的是:

* toMap 如果集合对象有重复的key,会报错Duplicate key ....

* apple1,apple12的id都为1。

* 可以用 (o1,o2)->o1 来设置,如果有重复的key,则保留key1,舍弃key2

*/

Map collect2 = lists.stream().collect(Collectors.toMap(String::toLowerCase, x -> x + "测试", (o1, x2) -> o1));

System.out.println("List转Map:" + collect2);

三. 简单说下声明式编程

小故事:早上刚上班,经理找到大胖说:“大胖啊,咱们下去去聚餐,软件园旁边有好几家不错的餐馆,如巫山烤鱼、海底捞、大鸭梨,你到大众点评调查一下,也问问去过的同事,看看哪家的口碑好。我们有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 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL深潜|剖析Performance Schema内存管理

简介&#xff1a; 本文主要是通过对PFS引擎的内存管理源码的阅读&#xff0c;解读PFS内存分配及释放原理&#xff0c;深入剖析其中存在的一些问题&#xff0c;以及一些改进思路。 一 引言 MySQL Performance schema(PFS)是MySQL提供的强大的性能监控诊断工具&#xff0c;提供…

敲地鼠java_Java实现的打地鼠小游戏完整示例【附源码下载】

本文实例讲述了Java实现的打地鼠小游戏。分享给大家供大家参考&#xff0c;具体如下&#xff1a;这里涉及到java线程和GUI的相关知识&#xff0c;一个简单的java小游戏打地鼠&#xff0c;有兴趣的朋友可以优化一下。先来看看运行效果&#xff1a;具体代码&#xff1a;Mouse.jav…

深入理解 Docker 网络原理

作者 | 渡、来源 | CSDN博客Docker网络原理容器是相对独立的环境&#xff0c;相当于一个小型的Linux系统&#xff0c;外界无法直接访问&#xff0c;那他是怎么做的呢&#xff0c;这里我们先了解下Linux veth pair。1. Linux veth pairveth pair是成对出现的一种虚拟网络设备接口…

全网首发|阿里资深技术专家数仓调优经验分享(上)

简介&#xff1a; 本篇文章总结了AnalyticDB表的设计的最佳经验、数据写入的最佳经验、高效查询的最佳实践&#xff0c;以及一些常见的问题。 随着云原生数据仓库AnalyticDB for MySQL&#xff08;下文统一简称&#xff1a;AnalyticDB&#xff09;在阿里集团各个业务线、社会上…

重大技术突破首次发布!十问解密云栖大会!

简介&#xff1a; 2021年10月19日&#xff0c;杭州&#xff0c;云栖大会正式开幕。大会上&#xff0c;阿里巴巴正式发布自研云芯片倚天710&#xff0c;这是阿里云推进“一云多芯”策略的重要一步&#xff0c;也是阿里第一颗为云而生的CPU芯片&#xff0c;将在阿里云数据中心部署…

Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?

作者 | 码哥来源 | 码哥字节原始数据存储在 DB 中&#xff08;如 MySQL、Hbase 等&#xff09;&#xff0c;但 DB 的读写性能低、延迟高。比如 MySQL 在 4 核 8G 上的 TPS 5000&#xff0c;QPS 10000 左右&#xff0c;读写平均耗时 10~100 ms。用 Redis 作为缓存系统正好可以…

在 Kubernetes 集群中使用 MetalLB 作为 Load Balancer(上)

作者 | Addo Zhang来源 | 云原生指北TL&#xff1b;DR网络方面的知识又多又杂&#xff0c;很多又是系统内核的部分。原本自己不是做网络方面的&#xff0c;系统内核知识也薄弱。但恰恰是这些陌生的内容满满的诱惑&#xff0c;加上现在的工作跟网络关联更多了&#xff0c;逮住机…

Java程序员情人节_盘点程序员情人节的表白,前端程序员最浪漫,后端不服来战...

今天是 2 月 14 日情人节&#xff0c;我看公众号后台有好多人在回复关键字&#xff1a;情人节表白代码。我想&#xff0c;我作为大家的校长&#xff0c;必须给大家送一波福利代码啊!我是真没想到&#xff0c;竟然很多程序员都想用代码表白&#xff0c;还整的挺浪漫的&#xff0…

GRPC: 如何实现分布式日志跟踪?

简介&#xff1a; 本文将介绍如何在 gRPC 分布式场景中&#xff0c;实现 API 的日志跟踪。 介绍 本文将介绍如何在 gRPC 分布式场景中&#xff0c;实现 API 的日志追踪。 什么是 API 日志追踪&#xff1f; 一个 API 请求会跨多个微服务&#xff0c;我们希望通过一个唯一的 ID…

一文搞懂物联网Modbus通讯协议

简介&#xff1a; 一般来说&#xff0c;常见的物联网通讯协议众多&#xff0c;如蓝牙、Zigbee、WiFi、ModBus、PROFINET、EtherCAT、蜂窝等。而在众多的物联网通讯协议中&#xff0c;Modbus是当前非常流行的一种通讯协议。它一种串行通信协议&#xff0c;是Modicon公司于1979年…

快看世界技术VP安尝思:从漫画到视频,如何用技术赋能创作

供稿 | 快看世界 2月25日&#xff0c;在火山引擎举办的视频云科技原力峰会上&#xff0c;快看世界技术VP安尝思受邀参加&#xff0c;并发表主题为《如何搭建轻量高效的视频技术体系》的演讲。 安尝思表示&#xff0c;快看视频内容的革命性变化来自于漫剧的推出&#xff0c;在过…

2021云栖大会丨阿里云发布第四代神龙架构,提供业界首个大规模弹性RDMA加速能力

简介&#xff1a; 10月20日&#xff0c;2021年杭州栖大云会上&#xff0c;阿里云发布第四代神龙架构&#xff0c;升级至全新的eRMDA网络架构&#xff0c;是业界首个大规模弹性RDMA加速能力。 10月20日&#xff0c;2021年杭州栖大云会上&#xff0c;阿里云发布第四代神龙架构。…

Rambus推出面向下一代数据中心的PCIe 6.0控制器

新闻摘要&#xff1a; 将先进的人工智能/机器学习、存储和网络应用的性能提升至64 GT/s优化了功耗、面积和延迟&#xff0c;全方位实现PCIe 6.0特性集成IDE引擎提供最先进的数据安全Rambus PCIe 6.0控制器框图 作为业界领先的芯片和IP核供应商&#xff0c;致力于使数据传输更…

阿里云混合云Apsara Stack 2.0发布 加速政企数智创新

简介&#xff1a; 2021年10月21日&#xff0c;杭州 – 今日&#xff0c;阿里云于云栖大会正式发布Apsara Stack 2.0&#xff0c;从面向单一私有云场景&#xff0c;升级为服务大型集团云&行业云场景。新一代Apsara Stack不仅可以为政企定制稳定、安全、开放、智能的数字底座…

ArrayList源码浅析

简介&#xff1a; ArrayList作为我们开发中最常用的集合&#xff0c;作为极高频次使用的类&#xff0c;我们不妨阅读源码一谈究竟。 前言 ArrayList作为我们开发中最常用的集合&#xff0c;作为极高频次使用的类&#xff0c;我们不妨阅读源码一谈究竟。 介绍 ArrayList继承…

阿里云边缘云ENS再升级 四大场景应用加速产业数字化落地

简介&#xff1a; 云栖大会 | 于10月21日上午举办的边缘云应用升级与技术创新论坛中&#xff0c;阿里云边缘云ENS产品全面升级&#xff0c;从边缘云产品、技术、行业应用等维度全面阐述阿里云在边缘计算领域的技术积累、产品&解决方案沉淀、商业实践。 一年一度科技圈盛事…

在 Kubernetes 集群中使用 MetalLB 作为 LoadBalancer(下)

作者 | Addo Zhang来源 | 云原生指北在上一篇《在 Kubernetes 集群中使用 MetalLB 作为 LoadBalancer&#xff08;上&#xff09;》中&#xff0c;我们使用 MetalLB 的 Layer2 模式作为 LoadBalancer 的实现&#xff0c;将 Kubernetes 集群中的服务暴露到集群外。还记得我们在 …

聚焦2021云栖大会,边缘云专场畅谈技术应用创新

简介&#xff1a; 本届大会以“前沿 探索 想象力”为主题&#xff0c;与业界同仁、合作伙伴共同打造一场数字时代的云上相聚。其中&#xff0c;边缘计算技术领域因5G快速发展而备受关注&#xff0c;阿里云边缘云专场吸引了数百位参会嘉宾驻足。 于10月21日上午举办的“边缘云应…

技术干货 | 闲鱼:一个优秀的 Push 平台,需要经历怎样的前世今生

简介&#xff1a; mPaaS 消息推送服务&#xff0c;快速集成多家厂商 Push 通道&#xff0c;有效提高用户留存率&#xff0c;提升用户体验。 编者荐语&#xff1a; 点击这里&#xff0c;了解 mPaaS 消息推送服务&#xff0c;快速集成多家厂商 Push 通道&#xff0c;有效提高用户…

「深入浅出」主流前端框架更新批处理方式

作者 | &#x1f47d;来源 | 前端Sharing背景在不同的技术框架背景下&#xff0c;处理更新的手段各不相同&#xff0c;今天我们来探讨一下&#xff0c;主流的前端框架批量处理的方式&#xff0c;和其内部的实现原理。通过今天的学习&#xff0c;你将收获这些内容&#xff1a;主…