1- # Java8 新特性实战
1+ ---
2+ title : Java8 新特性实战
3+ category : Java
4+ tag :
5+ - Java新特性
6+ ---
27
38> 本文来自[ cowbi] ( https://github.com/cowbi ) 的投稿~
49
@@ -602,14 +607,13 @@ public static <T> T requireNonNull(T obj) {
602607
603608`ofNullable` 方法和`of`方法唯一区别就是当 value 为 null 时,`ofNullable` 返回的是`EMPTY `,of 会抛出 `NullPointerException ` 异常。如果需要把 `NullPointerException ` 暴漏出来就用 `of`,否则就用 `ofNullable`。
604609
605-
606610** `map()` 和 `flatMap()` 有什么区别的?**
607611
608- 先看一下`map`和`flatMap`在`Stream `中的不同。
609612`map` 和 `flatMap` 都是将一个函数应用于集合中的每个元素,但不同的是`map`返回一个新的集合,`flatMap`是将每个元素都映射为一个集合,最后再将这个集合展平。
610613
611614在实际应用场景中,如果`map`返回的是数组,那么最后得到的是一个二维数组,使用`flatMap`就是为了将这个二维数组展平变成一个一维数组。
612- ```
615+
616+ ```java
613617public class MapAndFlatMapExample {
614618 public static void main (String [] args ) {
615619 List<String []> listOfArrays = Arrays . asList(
@@ -635,21 +639,24 @@ public class MapAndFlatMapExample {
635639}
636640
637641```
642+
638643运行结果:
644+
639645```
640646Using map:
641647[[APPLE , BANANA , CHERRY ], [ORANGE , GRAPE , PEAR ], [KIWI , MELON , PINEAPPLE ]]
642648
643649Using flatMap:
644650[APPLE , BANANA , CHERRY , ORANGE , GRAPE , PEAR , KIWI , MELON , PINEAPPLE ]
645-
646651```
652+
647653最简单的理解就是`flatMap()`可以将`map()`的结果展开。
648654
649655在`Optional `里面,当使用`map()`时,如果映射函数返回的是一个普通值,它会将这个值包装在一个新的`Optional `中。而使用`flatMap`时,如果映射函数返回的是一个`Optional `,它会将这个返回的`Optional `展平,不再包装成嵌套的`Optional `。
650656
651657下面是一个对比的示例代码:
652- ```
658+
659+ ```java
653660public static void main(String [] args) {
654661 int userId = 1 ;
655662
@@ -681,6 +688,7 @@ public static void main(String[] args) {
681688 System . out. println(" User's city without flatMap: " + cityWithoutFlatMap);
682689 }
683690```
691+
684692在`Stream `和`Optional `中正确使用`flatMap`可以减少很多不必要的代码。
685693
686694### 判断 value 是否为 null
@@ -759,7 +767,7 @@ public Optional<T> filter(Predicate<? super T> predicate) {
759767
760768### 小结
761769
762- 看完 `Optional ` 源码,`Optional ` 的方法真的非常简单,值得注意的是如果坚决不想看见 `NPE `,就不要用 `of() `、 `get()`、`flatMap(.. )`。最后再综合用一下 `Optional ` 的高频方法。
770+ 看完 `Optional ` 源码,`Optional ` 的方法真的非常简单,值得注意的是如果坚决不想看见 `NPE `,就不要用 `of()`、 `get()`、`flatMap(.. )`。最后再综合用一下 `Optional ` 的高频方法。
763771
764772```java
765773Optional . ofNullable(zoo). map(o - > o. getDog()). map(d - > d. getAge()). filter(v- > v== 1 ). orElse(3 );
@@ -1002,7 +1010,7 @@ System.out.println(date);
10021010// Wed Jan 27 14:05:29 CST 2021
10031011```
10041012
1005- 在新特性中引入了 `java.time. ZonedDateTime ` 来表示带时区的时间。它可以看成是 `LocalDateTime + ZoneId `。
1013+ 在新特性中引入了 `java.time. ZonedDateTime ` 来表示带时区的时间。它可以看成是 `LocalDateTime + ZoneId `。
10061014
10071015```java
10081016// 当前时区时间
0 commit comments