Lambda表达式和函数式接口
- 最简单的Lambda表达式可由逗号分隔的参数列表、->符号和语句块组成,例如:
Arrays.asList( "a", "b", "d" ).forEach( e -> {
System.out.print( e );
System.out.print( e );
} );
- Lambda表达式可以引用类成员和局部变量(会将这些变量隐式得转换成final的)
- 函数接口指的是只有一个函数的接口,这样的接口可以隐式转换为Lambda表达式。java.lang.Runnable和java.util.concurrent.Callable是函数式接口的最佳例子。
接口的默认方法和静态方法
- 默认方法和抽象方法之间的区别在于抽象方法需要实现,而默认方法不需要。
Java官方库的新特性
Optional
Streams
Date/Time API(JSR 310)
- Clock类使用时区来返回当前的纳秒时间和日期.Clock可以替代System.currentTimeMillis()。
final Clock clock = Clock.systemUTC();
System.out.println(clock.millis());
System.out.println(System.currentTimeMillis());
结果:
1513579690382
1513579690382
- LocalDate仅仅包含ISO-8601日历系统中的日期部分;LocalTime则仅仅包含该日历系统中的时间部分。
final Clock clock = Clock.systemUTC();
final LocalDate date = LocalDate.now();
final LocalDate date1 = LocalDate.now(clock);//UTC
System.out.println(date);
System.out.println(date1);
final LocalTime time = LocalTime.now();
final LocalTime time1 = LocalTime.now(clock);//UTC
System.out.println(time);
System.out.println(time1);
结果:
2017-12-18
2017-12-18
14:59:56.625
06:59:56.625
- LocalDateTime类包含了LocalDate和LocalTime的信息,但是不包含ISO-8601日历系统中的时区信息。
final LocalDateTime datetime = LocalDateTime.now();
System.out.println(datetime);
final LocalDateTime datetime1 = LocalDateTime.now(clock);//UTC
System.out.println(datetime1);
结果:
2017-12-18T15:04:08.986
2017-12-18T07:04:08.986
- 如果你需要特定时区的data/time信息,则可以使用ZoneDateTime,它保存有ISO-8601日期系统的日期和时间,而且有时区信息。
final ZonedDateTime zonedDatetime = ZonedDateTime.now();
final ZonedDateTime zonedDatetimeFromClock = ZonedDateTime.now( clock );
final ZonedDateTime zonedDatetimeFromZone = ZonedDateTime.now( ZoneId.of( "America/Los_Angeles" ) );
System.out.println( zonedDatetime );
System.out.println( zonedDatetimeFromClock );
System.out.println( zonedDatetimeFromZone );
结果:
2017-12-18T15:05:41.059+08:00[Asia/Shanghai]
2017-12-18T07:05:41.059Z
2017-12-17T23:05:41.062-08:00[America/Los_Angeles]
- Duration类,它持有的时间精确到秒和纳秒。这使得我们可以很容易得计算两个日期之间的不同
final LocalDateTime from = LocalDateTime.of( 2014, Month.APRIL, 16, 0, 0, 0 );
final LocalDateTime to = LocalDateTime.of( 2015, Month.APRIL, 16, 23, 59, 59 );
final Duration duration = Duration.between( from, to );
System.out.println( "Duration in days: " + duration.toDays() );
System.out.println( "Duration in hours: " + duration.toHours() );
结果
Duration in days: 0
Duration in hours: 23
Base64编码
- 对Base64编码的支持已经被加入到Java8官方库中,这样不需要使用第三方库就可以进行Base64编码
final String text = "Base64 finally in Java 8!";
final String encoded = Base64
.getEncoder()
.encodeToString( text.getBytes( StandardCharsets.UTF_8 ) );
System.out.println( encoded );
final String decoded = new String(
Base64.getDecoder().decode( encoded ),
StandardCharsets.UTF_8 );
System.out.println( decoded );
结果:
QmFzZTY0IGZpbmFsbHkgaW4gSmF2YSA4IQ==
Base64 finally in Java 8!
网友评论