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);//获取月份的最大天数