• JDK8 特性详解


    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

    自古英雄出炼狱,从来富贵入凡尘。
  • 相关阅读:
    bzoj 1176 cdq分治套树状数组
    Codeforces 669E cdq分治
    Codeforces 1101D 点分治
    Codeforces 1100E 拓扑排序
    Codeforces 1188D Make Equal DP
    Codeforces 1188A 构造
    Codeforces 1188B 式子转化
    Codeforces 1188C DP 鸽巢原理
    Codeforces 1179D 树形DP 斜率优化
    git commit -m "XX"报错 pre -commit hook failed (add --no-verify to bypass)问题
  • 原文地址:https://www.cnblogs.com/yunliu0603/p/9469610.html
Copyright © 2020-2023  润新知