Java 8的关键新特性:JDK加解密、Lambda表达式、日期时间API及Optional类
文章目录1、JDK加解密2、Lambda 表达式函数式编程的入口3、日期与时间API面向未来的日期处理4、Optional 类更优雅地处理null自从Java 8发布以来它就标志着Java编程语言的一个重要转折点。这一版本不仅带来了诸多功能上的改进还引入了一些革命性的特性彻底改变了开发者编写代码的方式。Java 8的设计目标是让语言更加简洁、更具表现力并且能够更好地适应多核处理器时代的需求。本文将探讨Java 8中最值得关注的新特性包括Lambda表达式、Stream API、新的日期与时间API以及Optional类等。下面我们来用代码来实现这些新增的属性1、JDK加解密jdk8之前使用jdk里sun.misc套件里的Base64Encode和Base64Decode加解密缺点编码和解码的效率比较差;引入apache commons codec有提供base64的编码和解码缺点是需要引入apache commons codec;jdk8在java.util包中新增了Base64类用于编码解码Base64类提供了直接可用的静态方法如Base64.getEncoder()和Base64.getDecoder()使得编码和解码变得非常直观和简单。开发者不需要手动管理编码器和解码器实例减少了出错的机会。代码实现publicclassJdkEncode{publicstaticvoidmain(String[]args)throwsIOException{//jdk8之前BASE64EncoderencodernewBASE64Encoder();BASE64DecoderdecodernewBASE64Decoder();Stringtexthello world;byte[]bytestext.getBytes(UTF-8);//编码Stringencodeencoder.encode(bytes);System.out.println(编码encode);//解码System.out.println(解码newString(decoder.decodeBuffer(encode),UTF-8));//jdk8Base64.Decoderdecoder1Base64.getDecoder();Base64.Encoderencoder1Base64.getEncoder();byte[]encode1encoder1.encode(bytes);System.out.println(编码encode1);System.out.println(解码newString(decoder1.decode(encode1),UTF-8));}}2、Lambda 表达式函数式编程的入口Java 8中最令人兴奋的特性之一无疑是Lambda表达式。这一特性允许开发者以一种简洁的方式定义匿名函数并将其作为方法参数传递。函数编程将一个函数作为一个参数进行传递面向对象是对数据的抽象而函数式编程则是对行为的抽象。lambda表达式使用场景一个接口只包含一个方法则可以使用lambda表达式这个接口称之为函数式接口java内置的四大核心函数式接口consumer消费型接口有入参无返回值void accept(T t) Supplier供给型接口无入参有返回值T get() Function函数型接口有入参有返回值 R apply(T t) Predicate段言型接口有入参有返回值返回值类型为boolean boolean test(T t)代码实现/** * 初识函数式 */publicstaticvoidtest1(){newThread(newRunnable(){Overridepublicvoidrun(){System.out.println(传统方式创建线程);}});//使用lambda表达式newThread(()-System.out.println(函数式编程创建线程));}/** * 集合排序 */publicstaticvoidtestList(){ListStringlistArrays.asList(aaa,bbb,ccc);Collections.sort(list,newComparatorString(){Overridepublicintcompare(Stringo1,Stringo2){returno2.compareTo(o1);}});for(Strings:list){System.out.println(s);}//lambda表达式实现ListStringlist1Arrays.asList(aaa,fff,ggg,ddd);Collections.sort(list1,(a,b)-b.compareTo(a));list1.forEach(System.out::println);}/** * 自定义函数接口 */publicstaticvoidtestFunction(){System.out.println(operator(20,5,(Integerx,Integery)-{returnx*y;}));System.out.println(operator(20,5,(x,y)-{returnx-y;}));System.out.println(operator(20,5,(x,y)-{returnxy;}));System.out.println(operator(20,5,(x,y)-{returnx/y;}));}/** * 自定义函数式接口 * param x * param y * param operFunction * return */publicstaticIntegeroperator(Integerx,Integery,OperFunctionInteger,IntegeroperFunction){returnoperFunction.operator(x,y);}/** * 传递多个参数bifunction */publicstaticvoidtestBiFunction(){System.out.println(biFunctionOperator(20,5,(x,y)-x*y));System.out.println(biFunctionOperator(20,5,(x,y)-x/y));System.out.println(biFunctionOperator(20,5,(x,y)-xy));System.out.println(biFunctionOperator(20,5,(x,y)-x-y));}publicstaticIntegerbiFunctionOperator(Integerx,Integery,BiFunctionInteger,Integer,IntegerbiFunction){returnbiFunction.apply(x,y);}自定义函数式接口FunctionalInterfacepublicinterfaceBiFunctionT,U,R{Rapply(Tt,Uu);}FunctionalInterfacepublicinterfaceOperFunctionR,T{Roperator(Tt1,Tt2);}3、日期与时间API面向未来的日期处理Java 8引入了一个全新的日期和时间API它位于java.time包中。这个API解决了旧版Date和Calendar类中存在的许多问题并提供了更为丰富和一致的功能集。新的API不仅更易于使用而且完全线程安全并且能够更好地适应不同的时区和地区设置。jdk8发布的Date-time api来进一步加强对日期与时间的处理 新增了很多常见的api,如日期/时间的比较加减格式化等 位于java.time中核心类localDate:不包含具体时间的日期 localTime: 不包含日期的时间 localDateTime包含日期和时间代码实现publicclassJdkTime{publicstaticvoidmain(String[]args){formatterTime();//获取当前日期LocalDatenowLocalDate.now();System.out.println(当前日期now);//获取年月日周期System.out.println(当前年now.getYear());System.out.println(当前月now.getMonth());System.out.println(当前月now.getMonthValue());System.out.println(当前日now.getDayOfMonth());System.out.println(当前周几now.getDayOfWeek().getValue());//加减年份加后返回的对象才是修改后的旧的依旧是旧的LocalDatelocalDatenow.plusYears(1);System.out.println(加后的年份localDate);//日期比较System.out.println(isAfter:localDate.isAfter(now));System.out.println(isBefore:localDate.isBefore(now));//getYear() int 获取当前⽇期的年份//getMonth() Month 获取当前⽇期的⽉份对象//getMonthValue() int 获取当前⽇期是第⼏⽉//getDayOfWeek() DayOfWeek 表示该对象表示的⽇期是星期⼏//getDayOfMonth() int 表示该对象表示的⽇期是这个⽉第⼏天//getDayOfYear() int 表示该对象表示的⽇期是今年第⼏天//withYear(int year) LocalDate 修改当前对象的年份//withMonth(int month) LocalDate 修改当前对象的⽉份//withDayOfMonth(int dayOfMonth) LocalDate 修改当前对象在当⽉的⽇期//plusYears(long yearsToAdd) LocalDate 当前对象增加指定的年份数//plusMonths(long monthsToAdd) LocalDate 当前对象增加指定的⽉份数//plusWeeks(long weeksToAdd) LocalDate 当前对象增加指定的周数//plusDays(long daysToAdd) LocalDate 当前对象增加指定的天数//minusYears(long yearsToSubtract) LocalDate 当前对象减去指定的年数//minusMonths(long monthsToSubtract) LocalDate 当前对象减去注定的⽉数//minusWeeks(long weeksToSubtract) LocalDate 当前对象减去指定的周数//minusDays(long daysToSubtract) LocalDate 当前对象减去指定的天数//compareTo(ChronoLocalDate other) int ⽐较当前对象和other对象在时间上的⼤⼩返回值如果为正则当前对象时间较晚//isBefore(ChronoLocalDate other) boolean ⽐较当前对象⽇期是否在other对象⽇期之前//isAfter(ChronoLocalDate other) boolean ⽐较当前对象⽇期是否在other对象⽇期之后//isEqual(ChronoLocalDate other) boolean ⽐较两个⽇期对象是否相等}/** * 时间日期格式化 */publicstaticvoidformatterTime(){//jdk8之前使用simpleDateFormat进行格式化simpleDateFormat不是线程安全的//jdk8之后使用线程安全的DateTimeFormatterLocalDateTimelocalDateTimeLocalDateTime.now();System.out.println(localDateTime);//格式化DateTimeFormatterdateTimeFormatterDateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss);StringldfStrdateTimeFormatter.format(localDateTime);System.out.println(ldfStr);//获取指定的日期时间LocalDateTimelocalDateTime1LocalDateTime.of(2024,07,15,16,26,30);System.out.println(localDateTime1);//计算日期时间差java.time.durationLocalDateTimenowLocalDateTime.now();System.out.println(now);LocalDateTimelocalDateTime2LocalDateTime.of(2023,12,12,12,12,12);System.out.println(localDateTime2);//第二个参数减第一个参数DurationdurationDuration.between(localDateTime2,now);//两个时间差的天数System.out.println(duration.toDays());//小时数System.out.println(duration.toHours());//分钟System.out.println(duration.toMinutes());//毫秒System.out.println(duration.toMillis());//纳秒System.out.println(duration.toNanos());}}4、Optional 类更优雅地处理null在Java中处理null值一直是一个常见的陷阱容易引发NullPointerException。为了解决这个问题Java 8引入了Optional类。Optional是一个可以为null的容器对象如果值存在则持有该值否则持有null。使用Optional可以有效地避免空指针异常并鼓励良好的编程实践。本质optional包含一个可选值的包装类意味着optional类既可以含有对象也可以为空创建optional类of() null值为参数传递进入会抛出异常 ofNullable(),对象可为null,也可不为null isPresent判断值是否存在 get()获取对象 orElse()如果有值则返回该值否则返回传递给它的参数值代码实现publicclassJdkOptional{publicstaticvoidmain(String[]args){//创建OptionalUserusernull;Useruser1newUser(1L,jack,11);// OptionalUser optional Optional.of(user);OptionalUseroptional1Optional.ofNullable(user);Useruser3Optional.ofNullable(user).orElse(user1);//获取optional对象的值get()//如果值存在则isPresent()方法会返回true调用get方法会返回该对象//一般使用get之前需要先验证是否有值不然还会报错if(optional1.isPresent()){Useruser2optional1.get();System.out.println(user2);}System.out.println(user3.getId());LongaLongOptional.ofNullable(user1).map(obj-obj.getId()).orElse(4L);System.out.println(aLong);}}Java 8引入的这些特性极大地简化了日常的开发任务提高了代码的可读性和可维护性。无论是通过Lambda表达式来简化函数式编程还是通过新的日期时间API来处理复杂的日期计算亦或是通过Optional类来优雅地处理null值都表明了Java语言正朝着更加现代化的方向发展。