黑马程序员技术交流社区

标题: java 1.8 新特性--5 [打印本页]

作者: tuan2016    时间: 2016-5-15 00:09
标题: java 1.8 新特性--5
本帖最后由 tuan2016 于 2016-5-15 00:16 编辑

4.3 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新的Date-Time API (JSR 310)在很大程度上受到Joda-Time的影响,并且吸取了其精髓。新的java.time包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during)与时钟(clock)的操作。在设计新版API时,十分注重与旧版API的兼容性:不允许有任何的改变(从java.util.Calendar中得到的深刻教训)。如果需要修改,会返回这个类的一个新实例。
让我们用例子来看一下新版API主要类的使用方法。第一个是Clock类,它通过指定一个时区,然后就可以获取到当前的时刻,日期与时间。Clock可以替换System.currentTimeMillis()与TimeZone.getDefault()。
  1. // Get the system clock as UTC offset
  2. final Clock clock = Clock.systemUTC();
  3. System.out.println( clock.instant() );
  4. System.out.println( clock.millis() );
复制代码

下面是程序在控制台上的输出:
  1. 2014-04-12T15:19:29.282Z
  2. 1397315969360
复制代码

我们需要关注的其他类是LocaleDate与LocalTime。LocaleDate只持有ISO-8601格式且无时区信息的日期部分。相应的,LocaleTime只持有ISO-8601格式且无时区信息的时间部分。LocaleDate与LocalTime都可以从Clock中得到。
  1. // Get the local date and local time
  2. final LocalDate date = LocalDate.now();
  3. final LocalDate dateFromClock = LocalDate.now( clock );
  4.         
  5. System.out.println( date );
  6. System.out.println( dateFromClock );
  7.         
  8. // Get the local date and local time
  9. final LocalTime time = LocalTime.now();
  10. final LocalTime timeFromClock = LocalTime.now( clock );
  11.         
  12. System.out.println( time );
  13. System.out.println( timeFromClock );
复制代码

下面是程序在控制台上的输出:
  1. 2014-04-12
  2. 2014-04-12
  3. 11:25:54.568
  4. 15:25:54.568
复制代码

LocaleDateTime把LocaleDate与LocaleTime的功能合并起来,它持有的是ISO-8601格式无时区信息的日期与时间。下面是一个快速入门的例子。
  1. // Get the local date/time
  2. final LocalDateTime datetime = LocalDateTime.now();
  3. final LocalDateTime datetimeFromClock = LocalDateTime.now( clock );
  4.         
  5. System.out.println( datetime );
  6. System.out.println( datetimeFromClock );
复制代码

下面是程序在控制台上的输出:
  1. 2014-04-12T11:37:52.309
  2. 2014-04-12T15:37:52.309
复制代码

如果你需要特定时区的日期/时间,那么ZonedDateTime是你的选择。它持有ISO-8601格式具具有时区信息的日期与时间。下面是一些不同时区的例子:
  1. // Get the zoned date/time
  2. final ZonedDateTime zonedDatetime = ZonedDateTime.now();
  3. final ZonedDateTime zonedDatetimeFromClock = ZonedDateTime.now( clock );
  4. final ZonedDateTime zonedDatetimeFromZone = ZonedDateTime.now( ZoneId.of( "America/Los_Angeles" ) );
  5.         
  6. System.out.println( zonedDatetime );
  7. System.out.println( zonedDatetimeFromClock );
  8. System.out.println( zonedDatetimeFromZone );
复制代码

下面是程序在控制台上的输出:
  1. 2014-04-12T11:47:01.017-04:00[America/New_York]
  2. 2014-04-12T15:47:01.017Z
  3. 2014-04-12T08:47:01.017-07:00[America/Los_Angeles]
复制代码

最后,让我们看一下Duration类:在秒与纳秒级别上的一段时间。Duration使计算两个日期间的不同变的十分简单。下面让我们看一个这方面的例子。
  1. // Get duration between two dates
  2. final LocalDateTime from = LocalDateTime.of( 2014, Month.APRIL, 16, 0, 0, 0 );
  3. final LocalDateTime to = LocalDateTime.of( 2015, Month.APRIL, 16, 23, 59, 59 );

  4. final Duration duration = Duration.between( from, to );
  5. System.out.println( "Duration in days: " + duration.toDays() );
  6. System.out.println( "Duration in hours: " + duration.toHours() );
复制代码

上面的例子计算了两个日期2014年4月16号与2014年4月16号之间的过程。下面是程序在控制台上的输出:
  1. Duration in days: 365
  2. Duration in hours: 8783
复制代码

对Java 8在日期/时间API的改进整体印象是非常非常好的。一部分原因是因为它建立在“久战杀场”的Joda-Time基础上,另一方面是因为用来大量的时间来设计它,并且这次程序员的声音得到了认可。更多详情请参考官方文档

4.4 JavaScript引擎Nashorn
Nashorn,一个新的JavaScript引擎随着Java 8一起公诸于世,它允许在JVM上开发运行某些JavaScript应用。Nashorn就是javax.script.ScriptEngine的另一种实现,并且它们俩遵循相同的规则,允许Java与JavaScript相互调用。下面看一个例子:
  1. ScriptEngineManager manager = new ScriptEngineManager();
  2. ScriptEngine engine = manager.getEngineByName( "JavaScript" );
  3.         
  4. System.out.println( engine.getClass().getName() );
  5. System.out.println( "Result:" + engine.eval( "function f() { return 1; }; f() + 1;" ) );
复制代码

下面是程序在控制台上的输出:
  1. jdk.nashorn.api.scripting.NashornScriptEngine
  2. Result: 2
复制代码

我们在后面的Java新工具章节会再次谈到Nashorn。

4.5 Base64
在Java 8中,Base64编码已经成为Java类库的标准。它的使用十分简单,下面让我们看一个例子:
  1. package com.javacodegeeks.java8.base64;

  2. import java.nio.charset.StandardCharsets;
  3. import java.util.Base64;

  4. public class Base64s {
  5.     public static void main(String[] args) {
  6.         final String text = "Base64 finally in Java 8!";
  7.         
  8.         final String encoded = Base64
  9.             .getEncoder()
  10.             .encodeToString( text.getBytes( StandardCharsets.UTF_8 ) );
  11.         System.out.println( encoded );
  12.         
  13.         final String decoded = new String(
  14.             Base64.getDecoder().decode( encoded ),
  15.             StandardCharsets.UTF_8 );
  16.         System.out.println( decoded );
  17.     }
  18. }
复制代码

程序在控制台上输出了编码后的字符与解码后的字符:
  1. QmFzZTY0IGZpbmFsbHkgaW4gSmF2YSA4IQ==
  2. Base64 finally in Java 8!
复制代码

Base64类同时还提供了对URL、MIME友好的编码器与解码器(Base64.getUrlEncoder() / Base64.getUrlDecoder(), Base64.getMimeEncoder() / Base64.getMimeDecoder())。

java1.8新特性系列
java 1.8 新特性--1
java 1.8 新特性--2
java 1.8 新特性--3
java 1.8 新特性--4
java 1.8 新特性--5
java 1.8 新特性--6





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2