Java 8新特性:DateTime、Lambda、Stream的强大功能解析

news2024/9/19 11:18:57
😊 @ 作者: 一恍过去
💖 @ 主页: https://blog.csdn.net/zhuocailing3390
🎊 @ 社区: Java技术栈交流
🎉 @ 主题: Java 8新特性:DateTime、Lambda、Stream的强大功能解析
⏱️ @ 创作时间: 2023年10月05日

目录

  • 一、Lambda简介
    • 1、Lambda标准格式
    • 2、Lambda表达式
    • 3、Lambda表达式使用前提
  • 二、Lambda使用
    • 1、遍历(forEach)
    • 2、遍历操作(map)
    • 3、条件过滤
    • 4、排序
    • 5、list转字符串拼接
    • 6、获取对象属性数据转List
    • 7、统计函数
  • 三、DateTime
    • 1、获取当前时间
    • 2、指定的日期和时间创建
    • 3、加减日期
    • 4、时间调整
    • 5、时间调整进阶配合 TemporalAdjusters
    • 6、时区操作
    • 7、时间戳操作
    • 8、日期格式化
    • 9、时间差

一、Lambda简介

1、Lambda标准格式

  • 三部分

  • 一些参数

  • 一个箭头

  • 一段代码

  • 格式

    • (参数列表) -> (重写方法的代码)
    • () :—> 没有参数就空着,有参数就写参数,多个参数都好分割
    • -> :—> 传递的意思
    • {} :—>重写抽象方法的方法体

2、Lambda表达式

  • Lambda表达式是可推导,可省略
  • 可省略的内容
    • (参数列表): 括号参数列表的数据类型可以省略不写
    • (参数列表): 括号的参数如果只有一个,那么类型和()都可以省略
    • (一些代码): 如果{}中的代码只有一行,无论是否有返回值,都可以省略({},return,分号)
    • 要省略{},return,分号必须一起省略

3、Lambda表达式使用前提

  • 使用Lambda必须要有接口,且要求接口中有且仅有一个抽象方法

    比如通过new Tread创建线程时使用。

二、Lambda使用

1、遍历(forEach)

		//Map对象
		Map<String,String> map= new HashMap<>();
        map.forEach((k,v)->{
            // 打印键
            System.out.println(k);
            // 打印值
            System.out.println(v);
        });
		//list对象
        List<Stu> list = new ArrayList();
        list.forEach((l)->{
            System.out.println(l.getId());
            System.out.println(l.getName());
        });
		//Set对象
        Set<Stu> set = new HashSet<>();
        set.forEach((s)->{
            System.out.println(s.getId());
            System.out.println(s.getName());
        });

2、遍历操作(map)

List<String> ids = new ArrayList<>();
List<String> collect = ids.stream().map(a -> a + "123").collect(Collectors.toList());	

3、条件过滤

//对象数据
List<User> list = new ArrayList<>();
List<User> collect = list.stream().filter(user -> !"张三".equals(user.getName()))
		.collect(Collectors.toList());
//单一数组
List<String> ids = new ArrayList<>();
List<String> collect = ids.stream().filter(id -> id.startsWith("12") && id.equals("123")).collect(Collectors.toList());

4、排序

//对象排序
//正序
List<User> list = new ArrayList<>();
list.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
//反序
list.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());

//基本类型集合排序
List<Integer> ids = new ArrayList<>();
//正序
ids.stream().sorted();
//反序
ids.stream().sorted(Comparator.reverseOrder());

//map按key排序
Map<Integer, Object> map = new HashMap<>();
List<Map.Entry<Integer, Object>> mapList = new ArrayList<>(map.entrySet());
mapList.sort(Comparator.comparing(Map.Entry::getKey));

//遍历排序map
mapList.forEach(entry -> {});

5、list转字符串拼接

// list通过filter后再转字符串
String collect = ids.stream().filter("123"::equals).collect(Collectors.joining("-"));
// 普通list转字符串
String collect2 = String.join("-", ids);

6、获取对象属性数据转List

List<User> list = new ArrayList<>();
List<Integer> collect = company.stream().map(User::getAge).collect(Collectors.toList());

7、统计函数

		List<Integer> list = Arrays.asList(12, 34, 23, 12, 3, 34);
        IntSummaryStatistics stats = list.stream().mapToInt(x -> x).summaryStatistics();
        //最大值
        stats.getMax();
        //最小值
        stats.getMin();
        //平均值
        stats.getAverage();
        //总数
        stats.getCount();
        //总和
        stats.getSum();

		int[] nums = {33, 44, 55, -111, -1};
        int min = IntStream.of(nums).min().getAsInt();
        System.out.println(min);

三、DateTime

DateTime取代Date类,该类的API修复了不合理的常量表示,严格按照ISO 8601规定的日期和时间格式进行输出,ISO 8601通过T进行日期和时间的分隔。
比如:

  • Month的范围用1~12表示1月到12月;
  • Week的范围用1~7表示周一到周日。

1、获取当前时间

LocalDate d = LocalDate.now(); // 当前日期
LocalTime t = LocalTime.now(); // 当前时间
LocalDateTime dt = LocalDateTime.now(); // 当前日期和时间

2、指定的日期和时间创建

// 指定各独立的日期和时间:
LocalDate d2 = LocalDate.of(2022, 4, 20); // 2022-04-20, 注意04=4月
LocalTime t2 = LocalTime.of(15, 16, 17); // 15:16:17
LocalDateTime dt2 = LocalDateTime.of(2022, 4, 20, 15, 16, 17);//2022-04-20T15:16:17
LocalDateTime dt3 = LocalDateTime.of(d2, t2);//2022-04-20T15:16:17

//传入时间字符串
LocalDate d = LocalDate.parse("2022-04-20");
LocalTime t = LocalTime.parse("15:16:17");
LocalDateTime dt3 = LocalDateTime.parse(" 2022-04-20 15:16:17");

3、加减日期

加时间:plusXXX(value),减时间:minusXXX(value)

LocalDateTime dt = LocalDateTime.now();
// 加1天减1小时:
LocalDateTime dt2 = dt.plusDays(1).minusHours(1);
// 减1月:
LocalDateTime dt3 = dt2.minusMonths(1);
System.out.println(dt3);
//对时间进行操作,出现跨年、跨月操作时,时间会自动进行转换,比如:2019-10-31减去1个月得到的结果是2019-09-30,因为9月没有31日。

4、时间调整

对日期和时间进行调整则使用withXxx()方法,例如:withHour(15)会把10:11:12变为15:11:12

  • 调整年:withYear()
  • 调整月:withMonth()
  • 调整日:withDayOfMonth()
  • 调整时:withHour()
  • 调整分:withMinute()
  • 调整秒:withSecond()
LocalDate dt = LocalDate.of(2020, 3, 31); //2020-03-31
System.out.println(dt);
// 月份变为4:
LocalDate dt3 = dt.withMonth(4);
System.out.println(dt3); //2020-04-30
//对时间进行操作,出现跨年、跨月操作时,时间会自动进行转换,比如:2020-03-31调整为4个月得到的结果是2020-04-30,因为4月没有31日。

5、时间调整进阶配合 TemporalAdjusters

通过with()可以进行更加复杂的运算

 dayOfWeekInMonth //它的值为同一个月中每一周的第几天
 firstDayOfMonth //它的值为当月的第一天
 firstDayOfNextMonth //它的值为下月的第一天
 firstDayOfNextYear //它的值为明年的第一天
 firstDayOfYear //它的值为当年的第一天
 firstInMonth //它的值为同一个月中,第一个符合星期几要求的值
 lastDayOfMonth //它的值为当月的最后一天
 lastDayOfYear //它的值为今年的最后一天
 //对指定星期的操作 - DayOfWeek
 lastInMonth //它的值为同一个月中,符合星期几要求的值
 next/previous//将日期向前一周或者向后一周,调整到指定星期几
 nextOrSame/previousOrSame //将日期向前或者向后,调整到指定星期几(如当前日期不存在于调整周的区间内则跨周),比如调整到周四,如果当天周二,则为本周周四;如果当天周五,则为下周四
     
//实列
LocalDate dt = LocalDate.now();
//明年的第一天
System.out.println(dt.with(TemporalAdjusters.firstDayOfNextYear()));
//两周后的周五
System.out.println(dt.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)).plusWeeks(1));

6、时区操作

ZonedDateTime zbj = ZonedDateTime.now(); // 默认时区时间
ZonedDateTime zny = ZonedDateTime.now(ZoneId.of("America/New_York"));//指定时区获取当前时间

//atZone时区转换,通过ZoneId指定要转换到的时区
//LocalDateTime转ZonedDateTime
LocalDateTime ldt = LocalDateTime.now();
//2020-04-15T15:16:17+08:00[Asia/Shanghai] 获取吗默认时区
ZonedDateTime zbj = ldt.atZone(ZoneId.systemDefault());
//2020-04-15T03:16:17-04:00[America/New_York],与美国差12小时
ZonedDateTime zny = ldt.atZone(ZoneId.of("America/New_York"));

//时区转换
//转为指定时区时间
ZonedDateTime zny = ldt.withZoneSameInstant(ZoneId.of("America/New_York"));
//转为当前时区时间
LocalDateTime date = zny.toLocalDateTime();

7、时间戳操作

System.currentTimeMillis();//毫秒级时间戳
Instant now = Instant.now();
System.out.println(now.getEpochSecond()); // 秒
System.out.println(now.toEpochMilli()); // 毫秒
Instant.ofEpochSecond(value);//设置秒时间戳
Instant.ofEpochMilli(value);//设置毫秒时间戳


//当前时间戳转换为指定时区
Instant ins = Instant.now();
ZonedDateTime zdt = ins.atZone(ZoneId.of("America/New_York"))
    
//时间戳转LocalDateTime
LocalDateTime time = LocalDateTime.ofInstant(Instant.ofEpochMilli(systemTime), ZoneId.systemDefault());

8、日期格式化

LocalDateTime dt = LocalDateTime .now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(dateTimeFormatter.format(dt));

9、时间差

LocalDate startDate=startDate;
LocalDate endDate=endDate;
long y = ChronoUnit.YEARS.between(startDate, endDate); //获取两个日期间隔年
long m = ChronoUnit.MONTHS.between(startDate, endDate);//获取两个日期间隔月
long d = ChronoUnit.DAYS.between(startDate, endDate); //获取两个日期间隔天

在这里插入图片描述

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

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

相关文章

案例题--Web应用考点

案例题--Web应用考点 负载均衡技术微服务XML和JSON无状态和有状态真题 在选择题中没有考察过web的相关知识&#xff0c;主要就是在案例分析题中考察 负载均衡技术 应用层负载均衡技术 传输层负载均衡技术 就近的找到距离最近的服务器&#xff0c;并进行分发 使用户就近获取…

超市便利店批发零售小程序商城的作用是什么

超市便利店甚至是商场&#xff0c;所售卖的产品广而多&#xff0c;其线上线下商家数量也非常庞大&#xff0c;对传统超市便利店来说&#xff0c;往往会优先发力线下经营&#xff0c;然而随着互联网电商冲击&#xff0c;传统线下经营也面临&#xff1a;拓客引流难、产品销售难、…

数组篇 第一题:删除排序数组中的重复项

更多精彩内容请关注微信公众号&#xff1a;听潮庭。 第一题&#xff1a;删除排序数组中的重复项 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应…

算法:最近公共祖先(LCA)

有根树中&#xff0c;每一个点都有好几个祖先&#xff08;在往根节点走的过程中遇到的都是它的祖先&#xff09;&#xff0c;一般化&#xff0c;把本身也称为它的祖先 对于两个点&#xff0c;离它们最近的一个公共祖先被称为最近公共祖先 法一&#xff1a;向上标记法&#xf…

6轮面试阿里Android开发offer,薪资却从21k降到17k,在逗我?

一小伙工作快3年了&#xff0c;拿到了阿里云Android开发岗位P6的offer&#xff0c;算HR面一起&#xff0c;加起来有6轮面试了&#xff0c;将近3个月的时间&#xff0c;1轮同级 1轮Android用人部门leader 1轮Android 组leader 1轮项目CTO 1轮HR 1轮HRBP。 一路上各种事件分…

图示矩阵分解

特征值与特征向量 设 A A A 是 n 阶矩阵&#xff0c;如果存在数 λ \lambda λ 和 n 维非零列向量 x x x&#xff0c;满足关系式&#xff1a; A x λ x ( 1 ) Ax \lambda x\quad\quad(1) Axλx(1) 则数 λ \lambda λ 称为矩阵 A A A 的特征值&#xff0c;非零向量 x…

基于阴阳对优化的BP神经网络(分类应用) - 附代码

基于阴阳对优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于阴阳对优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.阴阳对优化BP神经网络3.1 BP神经网络参数设置3.2 阴阳对算法应用 4.测试结果&#x…

学习记忆——宫殿篇——记忆宫殿——数字编码——扑克牌记忆

扑克牌我们可以通过以下3点进行识记&#xff1a; 1、先把扑克牌进行编码转换 2、确定要进行记忆的记忆宫殿 3、把扑克牌与记忆宫殿一一对应 首先54张扑克牌除去大小王后剩下52张&#xff0c;因为世界赛不需要记忆大小王。52张扑克牌都有对应的编码&#xff0c;每2张扑克牌对应…

阿里云新账户、老账号、产品首购和同人账号什么意思?

阿里云账号分为云新账户、老账户、同人账号和同一用户有什么区别&#xff1f;阿里云官方推出的活动很多是限制账号类型的&#xff0c;常见的如阿里云新用户&#xff0c;什么是阿里云新用户&#xff1f;是指从未在阿里云官网购买过云产品的账号。下面阿小云来详细说下什么是阿里…

docker系列6:docker安装redis

传送门 docker系列1&#xff1a;docker安装 docker系列2&#xff1a;阿里云镜像加速器 docker系列3&#xff1a;docker镜像基本命令 docker系列4&#xff1a;docker容器基本命令 docker系列5&#xff1a;docker安装nginx Docker安装redis 通过前面4节&#xff0c;对docke…

JS中创建对象有几种方法

除了使用Object构造函数或者字面量都可以创建对象&#xff0c;但是也有缺点就是使用同一个接口创建很多对象&#xff0c;会产生大量的重复代码。 1. 工厂模式 简单来说就是把Object创建对象使用函数进行封装&#xff0c;然后再返回创建的对象&#xff0c;就可以创建多个相同对…

使用hugo+github搭建免费个人博客

使用hugogithub搭建免费个人博客 前提条件 win11电脑一台电脑安装了git电脑安装了hugogithub账号一个 个人博客本地搭建 初始化一个博客 打开cmd窗口&#xff0c;使用hugo新建一个博客工程 hugo new site blogtest下载主题 主题官网&#xff1a;themes.gohugo.io 在上面…

快手直播显示请求过快

快手直播显示请求过快 问题描述情况一问题描述原因分析解决方案:情况二问题描述解决方法问题描述 在使用快手直播网页版时,如果我们的请求过于频繁,系统可能无法及时显示所需内容。这种情况下,我们会收到一个稍后重试的提示。一般有两种情况。一种是直接返回一段json,里面…

园林园艺服务经营小程序商城的作用是什么

园林园艺属于高单价服务&#xff0c;同时还有各种衍生服务&#xff0c;对企业来说&#xff0c;多数情况下都是线下生意拓展及合作等&#xff0c;但其实线上也有一定深度&#xff0c;如服务售卖或园艺产品售卖等。 基于线上发展可以增强获客引流、品牌传播、产品销售经营、会员…

云原生微服务 第六章 Spring Cloud中使用OpenFeign

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 文章目录 系列文章目录前言1、OpenFeign的实现…

mybatis-plus控制台打印sql(mybatis-Log)

配置了mybatis-plus.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl&#xff1b;但是mybatis执行的sql没有输出 需要检查点&#xff1a; 1、日志级别设置&#xff1a;请确保你的日志级别配置正确。如果日志级别设置得太低&#xff0c;可能导致SQL语句不…

软件工程与计算总结(四)项目管理基础

目录 一.项目和项目管理 二.团队组织与管理 三.软件质量保障 四.软件配置管理 五.项目实践 一.项目和项目管理 1.软件开发远不是纯粹的编程&#xff0c;随着软件规模的增长&#xff0c;软件开发活动也变得越来越复杂~ 2.软件项目就是要将所有的软件开发活动组织起来&#…

云原生Kubernetes:K8S集群kubectl命令汇总

目录 一、理论 1.概念 2. kubectl 帮助方法 3.kubectl 子命令使用分类 4.使用kubectl 命令的必要环境 5.kubectl 详细命令 一、理论 1.概念 kubectl是一个命令行工具&#xff0c;通过跟 K8S 集群的 API Server 通信&#xff0c;来执行集群的管理工作。 kubectl命令是操…

嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动

系列文章目录 文章目录 系列文章目录前言IMX6ULL介绍主要资料IO表现形式 汇编LED驱动原理图初始化流程时钟设置IO复用设置电气属性设置使用GPIO 编写驱动编译程序编译.o文件地址链接.elf格式转换.bin反汇编&#xff08;其他&#xff09; 综合成Makefile完成一步编译烧录程序imx…

分词.join 保存txt

要求 分词.join 保存txt 第1种方法 分词.join 保存txt input多行文本 /storage/emulated/0/数据中心/txt没有就新建为什么会想到这么做 1. 是因为有分词文件&#x1f4c4;要处理 2. 对各种词语和线索进行分类 3. 解释一下生活中不常见的现象&#xff0c;但是深刻的符合社会…