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

复制代码

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

目录

一、Lambda简介

1、Lambda标准格式

  • 三部分

  • 一些参数

  • 一个箭头

  • 一段代码

  • 格式

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

2、Lambda表达式

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

3、Lambda表达式使用前提

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

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

二、Lambda使用

1、遍历(forEach)

java 复制代码
		//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)

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

3、条件过滤

java 复制代码
//对象数据
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、排序

java 复制代码
//对象排序
//正序
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转字符串拼接

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

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

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

7、统计函数

java 复制代码
		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、获取当前时间

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

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

java 复制代码
// 指定各独立的日期和时间:
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)

java 复制代码
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()
java 复制代码
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()可以进行更加复杂的运算

java 复制代码
 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、时区操作

java 复制代码
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、时间戳操作

java 复制代码
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、日期格式化

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

9、时间差

java 复制代码
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); //获取两个日期间隔天
相关推荐
juniperhan30 分钟前
Flink 系列第21篇:Flink SQL 函数与 UDF 全解读:类型推导、开发要点与 Module 扩展
java·大数据·数据仓库·分布式·sql·flink
ID_1800790547332 分钟前
Python 实现亚马逊商品详情 API 数据准确性校验(极简可用 + JSON 参考)
java·python·json
c++之路1 小时前
C++23概述
java·c++·c++23
brucelee1861 小时前
Claude Code 安装教程(Windows / Linux / macOS)
linux·windows·macos
专注API从业者2 小时前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
摇滚侠2 小时前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql
keep one's resolveY2 小时前
SpringBoot实现重试机制的四种方案
java·spring boot·后端
天空属于哈夫克33 小时前
企业微信API常见的错误和解决方案
java·数据库·企业微信
摇滚侠4 小时前
VMvare 虚拟机 Oracle19c 安装步骤,远程连接 Oracle19c,百度网盘安装包
java·oracle
梁萌4 小时前
idea报错找不到XX包的解决方法
java·intellij-idea·启动报错·缺少包