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


      😊 @ 作者: 一恍过去
      🎊 @ 社区: 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)

      		//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());
              });
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20

      2、遍历操作(map)

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

      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());
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

      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 -> {});
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21

      5、list转字符串拼接

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

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

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

      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);
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16

      三、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(); // 当前日期和时间
      
      • 1
      • 2
      • 3

      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");
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

      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日。
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

      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日。
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      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));
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19

      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();
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16

      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());
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

      8、日期格式化

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

      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); //获取两个日期间隔天
      
      • 1
      • 2
      • 3
      • 4
      • 5

      在这里插入图片描述

    • 相关阅读:
      手撕排序之堆排序
      集群、限流、缓存 BAT 大厂无非也就是这么做
      MySQL中为什么要使用索引合并(Index Merge)
      算法基础:归并排序(超详细)
      明日方舟游戏助手:一键完成日常任务 | 开源日报 No.233
      MySQL什么情况下会死锁,发生了死锁怎么处理呢?
      Java设计模式-建造者模式
      微软文本转语音「免费网页版」
      C语言:输入t行字符串,每行字符串有10个字符
      K8S Service
    • 原文地址:https://blog.csdn.net/zhuocailing3390/article/details/133579409