• 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

    自古英雄出炼狱,从来富贵入凡尘。
  • 相关阅读:
    记一次线上Kafka消息堆积踩坑总结
    golang Time to String
    转MongoDB 使用Skip和limit分页
    golang mongodb (mgo)插入或读取文档的字段值为空(nil)问题解决
    Golang 中操作 Mongo Update 的方法
    基础知识
    Linux安全之SSH 密钥创建及密钥登录
    ssh配置authorized_keys后仍然需要输入密码的问题
    SSH隧道技术----端口转发,socket代理
    社会信息化环境下的IT新战略
  • 原文地址:https://www.cnblogs.com/yunliu0603/p/9469610.html
Copyright © 2020-2023  润新知