Java基础(十二) ---- JDK8新特性

Lambda表达式

更简洁的代码方式

作用:简化匿名内部类(适用于函数式接口)

好处:代码更简洁

缺点:代码可读性下降

注意点: 重写方法的形参只有一个时,可以不加小括号

Lambda表达式当中不允许声明一个与局部变量同名的参数或者局部变量

Lambda表达式中访问外层的局部变量,外层的局部变量自动变成隐式常量,默认添加final(类似局部内部类)

重写方法的形参同时加类型或同时不加类型

函数式接口

我们构建函数式接口的对象,最终目的就是调用这个函数式接口中的定义的唯一一个接口方法

既然是这样,那么我们在创建匿名内部类对象的时候,对这个接口方法进行了实现;

如果我们能够直接告诉这个对象在调用方法的时候要执行的代码就是 System.out.println(msg);

那么在构建的时候就将变得异常简单,这也就是JDK8提供的lambda表达式的来源

分类

Consumer<T> - 消费型接口(单列集合)

BiConsumer<T,U> - 消费型接口(双列集合)

Supplier<T> - 供给型接口

Predicate<T> - 断言型接口 条件检测接口,条件组装and\or\natego

Function<T,R> - 函数型接口 类型转换接口,将T类型传入,R类型返回

方法引用

含义:方法引用(Method Reference)是 Java 8 引入的一种语法糖,用于简化函数式接口的实现。

它提供了一种简洁的方式来直接引用已存在的方法作为 Lambda 表达式的替代,可以提高代码的可读性和简洁性

分类:成员方法、静态方法、构造方法

静态方法引用:类名::静态方法名 例如:Integer::parseInt,引用了 Integer 类的静态方法 parseInt

成员方法引用:对象名::成员方法名 例如:String::length,引用了 String 对象的成员方法 length

构造方法引用:类名::new 例如:ArrayList::new,引用了 ArrayList 类的构造方法

方法、构造方法和数组引用就是Lambda的另一种表现形式 若Lamdba表达式中的内容由方法已经实现了,可以使用方法引用这个技能

当你需要使用方法引用时,目标引用放在分隔符::前,方法的名称放在后面

Stream

含义:Stream 是 Java 8 引入的一种新的抽象概念,它提供了一种高效而功能丰富的数据处理方式。Stream 可以用于对集合(Collection)或数组(Array)等数据源进行一系列的操作,如过滤、映射、排序、聚合等,使得数据处理更加简洁、灵活和可读

常用的 Stream 操作包括

  • 过滤(filter):根据指定条件过滤元素

list.stream().filter(num -> num>3).forEach(System.out::println);
  • 映射(map):将元素转换为其他形式或提取特定属性

Arrays.stream(users).map(User::getUsername).forEach(System.out::println);
  • 排序(sorted):对元素进行排序

Stream.of(1, 3, 5, 2, 3, 1, 5, 8, 4).sorted().forEach(System.out::println);
Stream.of(1, 3, 5, 2, 3, 1, 5, 8, 4).sorted(((o1, o2) -> o2-o1)).forEach(System.out::println);
  • 限制(limit):限制元素的数量

Stream.of(1, 3, 5, 2, 3, 1, 5, 8, 4).limit(4).forEach(System.out::println);
  • 跳过(skip):跳过指定数量的元素

Stream.of(1, 3, 5, 2, 3, 1, 5, 8, 4).skip(2).forEach(System.out::println);
  • 去重(distinct):去除重复的元素

Stream.of(1, 3, 5, 2, 3, 1, 5, 8, 4).distinct().forEach(System.out::println);
  • 聚合(reduce):根据指定的操作将元素聚合成单个结果

  • 收集(collect):将元素收集到集合中

List<User> collect = userStream.collect(Collectors.toList());
Set<User> collect1 = userStream.collect(Collectors.toSet());
  • 统计(summaryStatistics):计算元素的统计信息,如最大值、最小值、平均值等

  • 终止操作(anyMatch):检测流中是否存在给定条件的元素

  • 终止操作(noneMatch):检测流中元素是否全部满足给定条件

  • 终止操作(allMatch):检测流中元素是否全部不满足给定条件

  • count():获取流中元素数量

并行流与串行流

Optional

日期组件

含义:JDK1.8提供的新日期类都是不可变的,既不管怎么样的改变,都会产生一个新的实例,他们都是线程安全的,日期组件遵循与IOS-8601世界时间标准

包路径类名描述
java.time针对日期和时间操作的包
LocalDate用于表示日期的类
LocalTime用于表示时间的类
LocalDateTime用于表示日期时间的类
Instant时间戳类(1970.1.1 0:0:0 到线程的毫秒数)
Period两个日期间隔类
Duration两个时间间隔类
java.time.chrono针对日期时间特殊格式操作的包
JapaneseChronology日本帝国历法系统类
ThaiBuddhistChronology泰国佛教日历系统类
java.time.format针对时间日期时间格式化操作的包
DateTimeFormatter格式化日期时间类
java.time.temporal针对时间矫正操作的包
java.time.zone针对时区操作的包

日期时间

LocalDateTime ldt1 = LocalDateTime.now();//获取当前时间对象
LocalDateTime ldt = LocalDateTime.of(2020,1,23,8,30,10,10);//获取指定时间对象
LocalDateTime ldt = ldt1.plusYears(2);//ldt1向后2年的时间对象
LocalDateTime ldt = ldt1.minusMonths(2);//ldt1向前2月的时间对象

时间戳

Instant ins = Instant.now();//1970年1月1日0:0:0到现在的毫秒值 获取UTC时区时间戳对象
OffsetDateTime odt = ins.atOffset(ZoneOffset.ofHours(8));//获取偏移8小时的偏移时间对象
long epochMilli = now.toEpochMilli();//获取时间戳的毫秒形式
Instsant ins = Instant.ofEpochSecond(1);//获取1970年1月1日0:0:0 过了1秒的时间戳对象

时间间隔

Instant now1 = Instant.now();
Thread.sleep(1000);
Instant now2 = Instant.now();
Duration duration = Duration.between(now1, now2);//获取时间间隔对象
​
LocalTime lt1 = LocalTime.now();
Thread.sleep(1000);
LocalTime lt2 = LocalTime.now();
Duration duration = Duration.between(lt1, lt2);//获取时间间隔类对象
​
LocalDate ld1 = LocalDate.now();
Thread.sleep(1000);
LocalDate ld2 = LocalDate.of(2020, 12, 31);
Period period = Period.between(ld1, ld2);//获取日期间隔类对象

时区

//获取所有时区字符串
Set<String> set = ZoneId.getAvailableZoneIds();
for (String str : set) {
    System.out.println(str);
}
​
//获取指定时区的日期时间对象
LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Tokyo"));
System.out.println(ldt);
​
//获取指定时区的日期时间对象 + 偏移量
LocalDateTime ldt2 = LocalDateTime.now(ZoneId.of("Asia/Tokyo"));
ZonedDateTime zonedDateTime = ldt2.atZone(ZoneId.of("Asia/Tokyo"));
System.out.println(zonedDateTime);

日期Date

Date date = new Date();//Thu Jul 13 19:15:40 CST 2023
long currentTime = System.currentTimeMillis();//当前时间,毫秒数
Date date = new Date(currentTime);//Thu Jul 13 19:15:40 CST 2023

日期时间格式化

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
String strDateTime = ldt1.format(dtf);//格式化时间日期
​
//将指定格式的字符串解析成LocalDateTime对象
LocalDateTime parse = LocalDateTime.parse("2020年03月12日 11:04:14", dtf2);
​
LocalDateTime ldt = LocalDateTime.now();
//获取本地标准的日期时间格式化对象
DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
String strDateTime = ldt.format(dtf);//格式化时间日期

日期格式化SimpleDateFormat

Date now = new Date();//Thu Jul 13 19:15:40 CST 2023
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
String dateStr = format.format(now);//2023年7月13日19时15分40秒

日历Calendar

Calendar c = Calendar.getInstance();
Date date = c.getTime();
c.set(Calendar.YEAR, 2020);//设置年份为2020年
c.set(Calendar.MONTH, 1);//设置月份,从0开始
c.roll(Calendar.DAY_OF_MONTH, -1);//天数-1
int year = c.get(Calendar.YEAR);//获取年份
int month = c.get(Calendar.MONTH);//获取月份
int day = c.get(Calendar.DAY_OF_MONTH);//获取一个月中的第几天
int hour = c.get(Calendar.HOUR_OF_DAY);//获取小时(24)
int hour = c.get(Calendar.HOUR);//获取小时(12)
int minute = c.get(Calendar.MINUTE);//获取分钟
int second = c.get(Calendar.SECOND);//获取秒
int maxDays = c.getActualMaximum(Calendar.DAY_OF_MONTH);//获取月份的最大天数

重复注解

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值