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);
|