Base64
对Base64编码的支持已经被加入到Java 8官方库中,这样不需要使用第三方库就可以进行Base64编码,例子代码如下:
1 package com.cn.yunliu.jdk8; 2 3 import java.nio.charset.StandardCharsets; 4 import java.util.Base64; 5 6 /** 7 * 8 * @author Administrator 9 * 10 * base64 编码格式 与解码 11 */ 12 public class Base64Code { 13 public static void main(String[] args) { 14 String str = "demo"; 15 //base64 encoded 把str转换成base64 bytes 16 String encoded = Base64.getEncoder().encodeToString(str.getBytes(StandardCharsets.UTF_8)); 17 System.out.println("encoded:"+encoded); 18 19 //base64 decoded 20 String decoded = new String(Base64.getDecoder().decode(encoded),StandardCharsets.UTF_8); 21 System.out.println("decoded:"+decoded); 22 } 23 }
这个例子的输出结果如下:
encoded:ZGVtbw==
decoded:demo
新的Base64API也支持URL和MINE的编码解码。
(Base64.getUrlEncoder() / Base64.getUrlDecoder(), Base64.getMimeEncoder() / Base64.getMimeDecoder())。
Date/Time API(JSR 310)
Java 8引入了新的Date-Time API(JSR 310)来改进时间、日期的处理。时间和日期的管理一直是最令Java开发者痛苦的问题。java.util.Date和后来的java.util.Calendar一直没有解决这个问题(甚至令开发者更加迷茫)。
因为上面这些原因,诞生了第三方库Joda-Time,可以替代Java的时间管理API。Java 8中新的时间和日期管理API深受Joda-Time影响,并吸收了很多Joda-Time的精华。新的java.time包包含了所有关于日期、时间、时区、Instant(跟日期类似但是精确到纳秒)、duration(持续时间)和时钟操作的类。新设计的API认真考虑了这些类的不变性(从java.util.Calendar吸取的教训),如果某个实例需要修改,则返回一个新的对象。
1 package com.cn.yunliu.jdk8; 2 3 import java.time.Clock; 4 import java.time.Duration; 5 import java.time.Instant; 6 import java.time.LocalDate; 7 import java.time.LocalDateTime; 8 import java.time.LocalTime; 9 import java.time.Month; 10 /** 11 * 12 * @author Administrator 13 * 14 *jdk 8 date 特性 15 */ 16 17 public class DateCode { 18 public static void main(String[] args) { 19 //localDate 只显示年月日 20 LocalDate ld = LocalDate.now(); 21 System.out.println("localdate:"+ld); 22 //LocalTime 只显示时分秒 23 LocalTime lt = LocalTime.now(); 24 System.out.println("localtime:"+lt); 25 26 //Clock类使用时区来返回当前的纳秒时间和日期,Clock可以替代System.currentTimeMillis()和TimeZone.getDefault()。 27 Clock clock = Clock.systemUTC(); 28 System.out.println("clock:"+clock); 29 Instant instant = clock.instant(); 30 System.out.println("instant:"+instant); 31 32 //localDateTime 包含了LocalDate和LocalTime的信息,但是不包含ISO-8601日历系统中的时区信息 33 LocalDateTime ldt = LocalDateTime.now(); 34 System.out.println("LocalDateTime:"+ldt); 35 36 //ZoneDateTime 它保存有ISO-8601日期系统的日期和时间,而且有时区信息。 37 38 //Duration 它持有的时间精确到秒和纳秒。这使得我们可以很容易得计算两个日期之间的不同 39 LocalDateTime start = LocalDateTime.of(2016, Month.JULY, 20, 18, 18); 40 LocalDateTime end = LocalDateTime.of(2017, Month.JULY, 20, 18, 18); 41 Duration dur = Duration.between(start, end); 42 43 System.out.println("2个时间差为:"+dur.toDays()+"day"+" "+dur.compareTo(Duration.ZERO)); 44 } 45 }
例子的输出结果是:
localdate:2018-08-13
localtime:17:29:13.438
clock:SystemClock[Z]
instant:2018-08-13T09:29:13.453Z
LocalDateTime:2018-08-13T17:29:13.469
2个时间差为:365day 1
Optional
Java应用中最常见的bug就是空值异常。在Java 8之前,Google Guava引入了Optionals类来解决NullPointerException,从而避免源码被各种null检查污染,以便开发者写出更加整洁的代码。Java 8也将Optional加入了官方库。
Optional仅仅是一个容易:存放T类型的值或者null。它提供了一些有用的接口来避免显式的null检查,可以参考Java 8官方文档了解更多细节。
接下来看一点使用Optional的例子:可能为空的值或者某个类型的值:
1 package com.cn.yunliu.jdk8; 2 3 import java.util.Optional; 4 /** 5 * 6 * @author Administrator 7 *如果Optional实例持有一个非空值,则isPresent()方法返回true, 8 *否则返回false;orElseGet()方法,Optional实例持有null, 9 *则可以接受一个lambda表达式生成的默认值; 10 *map()方法可以将现有的Opetional实例的值转换成新的值; 11 *orElse()方法与orElseGet()方法类似,但是在持有null的时候返回传入的默认值。 12 */ 13 public class OptionalCode { 14 public static void main(String[] args) { 15 //Optional实例为null,isPresent返回false 16 Optional<?> fullName = Optional.ofNullable("1");//or null 17 fullName.isPresent(); 18 System.out.println(fullName.isPresent()); 19 20 //orElseGet()方法,Optional实例持有null,则可以接受一个lambda表达式生成的默认值 21 fullName.orElseGet(()->"none"); 22 System.out.println(fullName.orElseGet(()->"none")); 23 Optional<?> opt =Optional.of("1"); 24 System.out.println(opt.orElse(null)); 25 26 //map()方法可以将现有的Opetional实例的值转换成新的值; 27 fullName.map(s->"nihao").orElse("none"); 28 System.out.println(fullName.map(s->"nihao").orElse("none")); 29 } 30 }
有值得输出结果如下:
true
1
1
nihao
当fullName为null时输出结果如下:
false
none
1
none