JDK8 新特性和stream流的使用(一)

JDK 8 的新特性包括:

  • Lambda表达式。允许编写更加简洁和灵活的代码,它允许将代码作为参数传递给其他方法或作为函数返回。Lambda表达式使用“->”操作符,并且可以包含一个或多个参数,这些参数的类型由编译器推断得出。123
  • 函数式接口的增强。在接口中可以添加默认方法和静态方法,这增强了接口的可扩展性和功能。14
  • Optional类。用于避免NullPointerException的检查,提供了处理可能为空的对象的便捷方式。13
  • 新的时间和日期API。重新设计了API,支持多线程操作,并且提供了更现代的设计。1
  • 可重复注解。允许在同一个位置放置多个相同的注解。
  • Stream API。提供了一种强大的数据操作方式,类似于SQL语句,使得处理集合和数据更加高效和简洁。
  • 并行Stream操作。通过Fork/Join框架提升性能,简化并行编程。
  • 速度优化。包括改进的垃圾回收机制,如元空间的引入代替了永久代,以及数据结构如HashMap的调整。3
  • ConcurrentHashMap的改进。从锁分段机制改为大量CAS操作,同时HashMap和ConcurrentHashMap的结构也从链表改为链表+红黑树。
  • 引入新的Date/Time API。提供了更现代的时间和日期处理方式。4
  • jdeps命令行工具。用于分析类、目录、jar包的类依赖层级关系。
  • MetaSpace取代永久代。JVM使用MetaSpace代替了永久代,以优化内存管理和避免内存溢出。

jdk8 Stream API

      1. map集合value总和

        在Java中,使用Stream API对Map集合的value进行求和操作是一个常见的需求。以下是一个示例,展示了如何使用Stream API来计算Map集合中所有value的总和:

import java.util.HashMap;  
import java.util.Map;  
import java.util.OptionalDouble;  public class MapSumExample {  public static void main(String[] args) {  Map<String, Integer> map = new HashMap<>();  map.put("apple", 1);  map.put("banana", 2);  map.put("cherry", 3);  map.put("date", 4);  // 使用Stream API计算Map中所有value的总和  OptionalDouble sum = map.values().stream()  .mapToInt(Integer::intValue) // 将Integer转换为int的Stream  .summaryStatistics() // 获取IntSummaryStatistics  .getSum(); // 获取总和  // 如果确定map不为空且value都是非null,可以直接使用sum()  double directSum = map.values().stream()  .mapToDouble(Integer::doubleValue) // 将Integer转换为double的Stream  .sum();  System.out.println("使用summaryStatistics的总和: " + sum.getAsDouble());  System.out.println("直接求和的总和: " + directSum);  }  
}

 

在这个例子中,我们首先创建了一个包含字符串键和整数值的Map。然后,我们使用map.values().stream()来获取Map中所有value的Stream。接着,我们使用mapToInt(Integer::intValue)将Stream中的Integer对象转换为int类型的Stream,以便进行数值计算。最后,我们使用sum()方法计算总和。

另外,我们还可以通过summaryStatistics()方法获取一个IntSummaryStatistics对象,它包含了流中元素的各种摘要统计信息,如计数、总和、平均值、最大值和最小值等。在这个例子中,我们只关心总和,所以使用getSum()方法来获取它。

注意,如果Map可能为空或者value可能包含null,那么在求和之前应该进行非空检查。在上面的示例中,我们假设Map不为空且value都是非null。

最后,请注意summaryStatistics()方法可能会在处理大数据集时导致性能下降,因为它需要计算所有的摘要统计信息,而不仅仅是总和。如果只需要计算总和,使用sum()方法会更高效。

2. 合并map切value相同时

如果你想要合并两个Map,并且当key相同时,将它们的value进行加和,你可以使用Stream API结合Collectors.toMap来实现。

思考: 首先创建了两个包含不同键值对的Map:map1map2。然后,我们使用Stream.of(map1, map2)创建一个包含这两个Map的Stream。接着,我们使用flatMap将每个Map的entry集合转换成一个单独的Stream,并合并它们。最后,我们使用Collectors.toMap收集器来创建一个新的Map。

import java.util.HashMap;  
import java.util.Map;  
import java.util.function.BinaryOperator;  
import java.util.stream.Collectors;  public class MergeMapsExample {  public static void main(String[] args) {  Map<String, Integer> map1 = new HashMap<>();  map1.put("apple", 1);  map1.put("banana", 2);  Map<String, Integer> map2 = new HashMap<>();  map2.put("banana", 3);  map2.put("cherry", 4);  // 合并两个Map,并对相同key的value进行加和  Map<String, Integer> mergedMap = Stream.of(map1, map2)  .flatMap(map -> map.entrySet().stream())  .collect(Collectors.toMap(  Map.Entry::getKey,  Map.Entry::getValue,  Integer::sum // 当key相同时,使用sum作为合并函数  ));  System.out.println(mergedMap); // 输出: {apple=1, banana=5, cherry=4}  }  
}

Collectors.toMap接收三个参数:

  1. key的映射函数,这里使用Map.Entry::getKey
  2. value的映射函数,这里使用Map.Entry::getValue
  3. merge函数,当key冲突时用于合并value。这里我们传递Integer::sum作为merge函数,它将相同key的value相加。

3. 对list集合操作

在Java中,如果你有一个包含对象的List集合,并且这些对象有一个时间属性,你可以使用Stream API的`sorted()`方法来根据时间属性对List中的对象进行升序排序。下面是一个简单的示例,说明如何做到这一点:

首先,假设你有一个`Event`类,它有一个`LocalDateTime`类型的`time`属性:


import java.time.LocalDateTime;public class Event {private LocalDateTime time;// 其他属性...public Event(LocalDateTime time) {this.time = time;}public LocalDateTime getTime() {return time;}// 其他getter和setter方法...@Overridepublic String toString() {return "Event{" +"time=" + time +'}';}
}

现在,假设你有一个`Event`对象的List集合,你想要根据`time`属性进行升序排序:

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class EventListSortingExample {public static void main(String[] args) {List<Event> events = new ArrayList<>();events.add(new Event(LocalDateTime.of(2023, 3, 10, 15, 0)));events.add(new Event(LocalDateTime.of(2023, 3, 9, 10, 0)));events.add(new Event(LocalDateTime.of(2023, 3, 11, 8, 0)));// 使用Stream API根据时间进行升序排序List<Event> sortedEvents = events.stream().sorted((e1, e2) -> e1.getTime().compareTo(e2.getTime())).collect(Collectors.toList());// 打印排序后的事件sortedEvents.forEach(System.out::println);}
}

在上面的代码中,我们创建了一个`Event`对象的List,并使用`stream()`方法将其转换为一个Stream。然后,我们调用`sorted()`方法,并传递一个Comparator,它比较两个`Event`对象的`time`属性。`LocalDateTime`的`compareTo()`方法会根据时间顺序进行比较,从而实现升序排序。最后,我们使用`collect()`方法将排序后的Stream转换回List。

输出将会是根据时间升序排序的`Event`对象列表:

Event{time=2023-03-09T10:00}
Event{time=2023-03-10T15:00}
Event{time=2023-03-11T08:00}

注意:如果`time`属性有可能为`null`,那么在Comparator中需要添加适当的空值检查来避免`NullPointerException`。此外,如果你的List非常大,排序操作可能会消耗较多的内存和CPU时间,因此在实际应用中需要考虑性能因素。

对list集合还有很多操作...

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

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

相关文章

一键优化B2B2C电商系统,开启无限商机

在当今竞争激烈的电商行业&#xff0c;B2B2C模式已成为众多企业选择的经营模式之一。通过一键优化B2B2C电商系统&#xff0c;企业能够开启无限商机&#xff0c;实现更大的发展空间。 首先&#xff0c;优化B2B2C电商系统可以帮助企业提升用户体验&#xff0c;吸引更多客户。通过…

仿生蝴蝶制作——蝴蝶翅膀制作

前言 上一次已经设计好了的翅膀图纸 接下来就是根据这个图纸来制作翅膀。 过程中其实可以不用尺子准确测量&#xff0c;直接用碳纤维棒比着剪下来就好了&#xff0c;然后把减下来的一截比着剪下另一只翅膀需要的材料。因为左右两只翅膀差别不能太大&#xff0c;所以这样是最好…

异步编程和asyncio

介绍异步编程的重要性和在Python中的应用&#xff0c;特别是在I/O密集型任务和网络编程场景下。 目录 理解异步编程 异步编程基本概念 任务与Future 异步编程的工作原理 事件循环 协程&#xff08;Coroutines&#xff09; 异步与同步代码的结合 深入asyncio模块 事件循…

CCF-C推荐会议 IEEE CLOUD‘24 3月24日截稿!深圳开启全球云计算新纪元!

会议之眼 快讯 IEEE CLOUD(IEEE International Conference on Cloud Computing)即IEEE云计算国际会议将于 2024 年7月7日至13日在中国深圳举行&#xff01;IEEE CLOUD由lEEE Computer Society主办&#xff0c;CCF服务计算专委会、北京大学、IBM Research承办。CLOUD一直是研究人…

软件测试APP完整测试作业流程(附流程图),公司级软件测试流程化办公

目录 1. 概述 2. 软件测试流程 3. 软件测试周期人员活动图 4. 总结 1. 概述 1.1 目的 有效的保证软件质量&#xff1b; 有效的制定不同测试类型&#xff08;软件系统测试、音频主观性测试、Field Trial、专项测试、自动化测试、性 能测试、用户体验测试&#xff09;的软件…

【框架设计】MVC和MVVM对比图

1. MVC&#xff08;Model-View-Controller&#xff09; 单向通信View和Model通过Controller承上启下 2. MVVM&#xff08;Model-View-ViewModel&#xff09; 数据绑定M -> VM -> V DOM事件监听 V -> VM -> M 1. MVC是单向的&#xff0c;MVVM是双向的&#xff0c;…

【SpringCloud微服务全家桶学习笔记-GateWay网关(微服务入口)】

Gateway服务网关 API网关为微服务架构中的服务提供了统一的访问入口&#xff0c;客户端通过API网关访问相关服务。API网关的定义类似于设计模式中的门面模式&#xff0c;它相当于整个微服务架构中的门面&#xff0c;所有客户端的访问都通过它来进行路由及过滤。它实现了请求路…

二 超级数据查看器   讲解稿   导入功能

二 超级数据查看器 讲解稿 导入功能 APP下载地址 百度手机助手 下载地址4 ​ 讲解稿全文&#xff1a; 大家好。 今天我们对 超级数据查看器的 导入信息功能 做一下详细讲解。 首先&#xff0c;我们打开 超级数据查看器。 我们这个系统要实现的是&#xff0c;快速生…

GEE:基于Landsat8计算陆地表面温度(Land Surface Temperature,LST)

作者&#xff1a;CSDN _养乐多_ 本文将介绍在Google Earth Engine&#xff08;GEE&#xff09;平台上使用 Landsat 8 卫星影像数据计算陆地表面温度&#xff08;Land Surface Temperature&#xff0c;LST&#xff09;的代码。 结果如下图所示&#xff0c; 文章目录 一、参考…

ChatGPT Prompt方法原理详解

在人工智能的浪潮中,ChatGPT以其出色的对话生成能力引起了广泛关注。其强大的功能背后,离不开其独特的Prompt方法。本文将深入剖析ChatGPT Prompt方法的原理,带领读者了解其背后的奥秘。 ChatGPT Prompt方法的核心在于通过精心设计的提示语(Prompt),引导模型生成符合要求…

阿里P8解析自动化测试工具 —— SeleniumAppium!

自动化测试&#xff0c;利用自动化测试工具&#xff0c;通过录制/编程方式实现测试活动&#xff0c;发现被测对象存在的缺陷&#xff0c;从而替代手工测试活动。自动化测试不局限于某个具体测试阶段&#xff0c;也不局限被测对象的类型&#xff0c;只要满足自动化测试的必要条件…

数据库--SQL语言-1

练习网站&#xff1a;自学SQL网 Select 查询语法复习 SELECT column, another_column, …FROM mytableWHERE condition AND/OR another_condition AND/OR …; 操作符号&#xff1a; 如果属性是字符串, 我们会用到字符串相关的一些操作符号&#xff0c;其中 LIKE&#xff08…

day04-Maven-SpringBootWeb入门

文章目录 01. Maven1.1 课程安排1.2 什么是Maven1.3 Maven的作用1.4 Maven模型1.5 Maven仓库1.6 Maven安装1.6.1 下载1.6.2 安装步骤 2 IDEA集成Maven2.1 配置Maven环境2.1.1 当前工程设置2.1.2 全局设置 2.2 创建Maven项目2.3 POM配置详解2.4 Maven坐标详解2.5 导入Maven项目 …

【axios】你的进度条准确吗

1、axios监听进度 上传和下载操作在前端中是非常常见的&#xff0c;当我们想知道上传或下载的进度时也不难&#xff0c;axios已经实现了监听进度的方法 import axios from axios// 上传请求 axios.post(/api/v1/upload, {data: xxx},{// onUploadProgress回调可以获取进度onU…

mysql 常用命令

1、显示锁的时间 show status like innodb_row_lock%;2、锁一行的方法 //开启 begin; //锁一行 select * from tbl_user where name 1aa1 for update;//解锁 commit;3、设置不自动提交 set autocommit 0; //自动提交 set autocommit 1;4、查看是否支持profile show vari…

2 月 Web3 游戏行业动态

作者&#xff1a;stellafootprint.network 数据来源&#xff1a;区块链游戏研究页面 - Footprint Analytics 2024 年 2 月&#xff0c;区块链游戏领域在加密货币价格上涨和活跃用户激增的推动下&#xff0c;实现了显著增长。然而&#xff0c;行业在维持用户参与度和留存率方面…

NodeJS实现线性查找算法

NodeJS实现线性查找算法 以下是使用 Node.js 实现线性搜索算法的示例代码&#xff1a; function linearSearch(arr, target) {for (let i 0; i < arr.length; i) {if (arr[i] target) {return i; // 如果找到目标&#xff0c;返回索引}}return -1; // 如果未找到目标&am…

ES6基础3

函数的扩展 基本用法 函数参数的默认值 ES6允许为函数的参数设置默认值&#xff0c;即直接写在参数定义的后面。 参数变量是默认声明的&#xff0c;所以不能用let或const再次声明。下面代码中&#xff0c;参数变量x是默认声明的&#xff0c;在函数体中&#xff0c;不能用let或c…

微服务配置中心

什么是配置中心 配置中心是一种用于管理应用程序或系统配置信息的中央服务。它允许开发人员在多个环境&#xff08;如开发、测试、生产&#xff09;之间共享配置&#xff0c;并且可以在不停止应用程序的情况下动态更新配置。 配置中心是统一管理各种应用配置的工具。它能够集中…

注解、反射

前言 注解与反射 文章目录 前言一、注解二、反射1、作用 一、注解 注解不影响程序逻辑&#xff0c;但会被编译器在不同阶段&#xff08;编译、执行&#xff09;执行&#xff1b; 例如&#xff0c;Override 注解会在编译时执行&#xff0c;用来检验代码是否符合规范&#xff0c…