Fork me on GitHub
0%

Java 8 特性--Optional 类、时间 API 以及 Base64 编解码

Optional 类

Optional 类是一个可以为 null 的容器对象,可以保存类型 T 的值,或者仅仅保存 null,它提供很多有用的方法,让我们不用再显式的进行空值检测,Optional 类的引入很好的避免了发生空指针异常,下面我们看一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Integer value1 = null;
Integer value2 = 10;

// Optional.ofNullable - 允许传递为 null 参数
Optional<Integer> optional1 = Optional.ofNullable(value1);

// Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
Optional<Integer> optional2 = Optional.of(value2);

System.out.println("第一个参数值是否存在: " + optional1.isPresent());
System.out.println("第二个参数值是否存在: " + optional2.isPresent());

// Optional.orElse - 如果值存在,返回它,否则返回默认值
Integer result1 = optional1.orElse(0);
System.out.println(result1);

//Optional.get - 获取值,值需要存在
Integer result2 = optional2.orElse(0);
System.out.println(result2);

Java 8 日期时间 API

在 Java 8 以前,我们都知道 Java 中的时间处理很繁琐,有时候还会去纠结我到底是用 java.util 包下的日期还是 java.sql 包下的日期呢。因此往往在遇到时间处理问题时都会借助于框架来实现,比如 Joda-Time。但在 Java 8 中也增加了同样的类似框架功能的时间处理 API,下面列出一些简单的例子:

1
2
3
4
5
//Clock 类使用时区来返回当前的毫秒数和日期。Clock 可以替代System.currentTimeMillis() 和 TimeZone.getDefault()。

Clock clock = Clock.systemUTC();
System.out.println(clock.millis());
System.out.println(System.currentTimeMillis());
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 获取当前日期
LocalDate currentDate = LocalDate.now();
System.out.println("当前日期: " + currentDate);
// 获取当前时间
LocalTime currentTime = LocalTime.now();
System.out.println("当前时间: " + currentTime);
// 获取当前日期时间
LocalDateTime currentDateTime = LocalDateTime.now();
System.out.println("当前日期时间: " + currentDateTime);
// 根据当前日期时间获取当前日期
LocalDate currentDate1 = currentDateTime.toLocalDate();
System.out.println("currentDate1: " + currentDate1);
// 根据当前日期时间获取当前时间
LocalTime currentTime1 = currentDateTime.toLocalTime();
System.out.println("currentTime1: " + currentTime1);

Month month = currentDateTime.getMonth();
int day = currentDateTime.getDayOfMonth();
int seconds = currentDateTime.getSecond();
System.out.println("月: " + month +", 日: " + day +", 秒: " + seconds);

// 指定日期
LocalDateTime date2 = currentDateTime.withDayOfMonth(10).withYear(2012);
System.out.println("date2: " + date2);

// 12 december 2014
LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);
System.out.println("date3: " + date3);

// 22 小时 15 分钟
LocalTime date4 = LocalTime.of(22, 15);
System.out.println("date4: " + date4);

// 解析字符串
LocalTime date5 = LocalTime.parse("20:15:30");
System.out.println("date5: " + date5);
// 获取当前日期时间的另一个时区的日期时间

System.out.println(currentDateTime.atZone(ZoneId.of("America/New_York")));
1
2
3
4
5
LocalDateTime from = LocalDateTime.of( 2017, Month.MAY, 16, 0, 0, 0 );
LocalDateTime to = LocalDateTime.of( 2018, Month.MAY, 16, 23, 59, 59 );
Duration duration = Duration.between( from, to );
System.out.println( "Duration in days: " + duration.toDays() );
System.out.println( "Duration in hours: " + duration.toHours());

上面只是列举了一些简单的东西,其实还有一些,比如时间的加减运算,这些在用到时可以根据提示来进行我们想要的操作。

Java8 Base64

Java 8 内置了 Base64 编码的编码器和解码器,并且 Base64 工具类提供了一套静态方法获取下面三种 BASE64 编解码器:

  • 基本:输出被映射到一组字符 A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持 A-Za-z0-9+/。
  • URL:输出映射到一组字符A-Za-z0-9+_,输出是 URL 和文件。
  • MIME:输出映射到 MIME 友好格式,输出每行不超过 76 字符,并且使用 ‘\r’ 并跟随 ‘\n’ 作为分割,编码输出最后没有行分割。

下面也是一个简单的例子展示了如何获取这三种编解码器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 基本编码
String base64encodedString = Base64.getEncoder().encodeToString("java 8".getBytes("utf-8"));
System.out.println("Base64 编码字符串 (基本) :" + base64encodedString);
// 基本解码
byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);
System.out.println("原始字符串: " + new String(base64decodedBytes, "utf-8"));

// URL 编码
base64encodedString = Base64.getUrlEncoder().encodeToString("url?java8".getBytes("utf-8"));
System.out.println("Base64 编码字符串 (URL) :" + base64encodedString);
// URL 解码
byte[] base64decodedBytesUrl = Base64.getUrlDecoder().decode(base64encodedString);
System.out.println("原始字符串: " + new String(base64decodedBytesUrl, "utf-8"));

StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 10; ++i) {
stringBuilder.append(UUID.randomUUID().toString());
}
byte[] mimeBytes = stringBuilder.toString().getBytes("utf-8");
// MINE 编码
String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes);
System.out.println("Base64 编码字符串 (MIME) :" + mimeEncodedString);
 wechat
扫描上面图中二维码关注微信公众号