1
- # Java8 新特性实战
1
+ ---
2
+ title : Java8 新特性实战
3
+ category : Java
4
+ tag :
5
+ - Java新特性
6
+ ---
2
7
3
8
> 本文来自[ cowbi] ( https://github.com/cowbi ) 的投稿~
4
9
@@ -602,14 +607,13 @@ public static <T> T requireNonNull(T obj) {
602
607
603
608
`ofNullable` 方法和`of`方法唯一区别就是当 value 为 null 时,`ofNullable` 返回的是`EMPTY `,of 会抛出 `NullPointerException ` 异常。如果需要把 `NullPointerException ` 暴漏出来就用 `of`,否则就用 `ofNullable`。
604
609
605
-
606
610
** `map()` 和 `flatMap()` 有什么区别的?**
607
611
608
- 先看一下`map`和`flatMap`在`Stream `中的不同。
609
612
`map` 和 `flatMap` 都是将一个函数应用于集合中的每个元素,但不同的是`map`返回一个新的集合,`flatMap`是将每个元素都映射为一个集合,最后再将这个集合展平。
610
613
611
614
在实际应用场景中,如果`map`返回的是数组,那么最后得到的是一个二维数组,使用`flatMap`就是为了将这个二维数组展平变成一个一维数组。
612
- ```
615
+
616
+ ```java
613
617
public class MapAndFlatMapExample {
614
618
public static void main (String [] args ) {
615
619
List<String []> listOfArrays = Arrays . asList(
@@ -635,21 +639,24 @@ public class MapAndFlatMapExample {
635
639
}
636
640
637
641
```
642
+
638
643
运行结果:
644
+
639
645
```
640
646
Using map:
641
647
[[APPLE , BANANA , CHERRY ], [ORANGE , GRAPE , PEAR ], [KIWI , MELON , PINEAPPLE ]]
642
648
643
649
Using flatMap:
644
650
[APPLE , BANANA , CHERRY , ORANGE , GRAPE , PEAR , KIWI , MELON , PINEAPPLE ]
645
-
646
651
```
652
+
647
653
最简单的理解就是`flatMap()`可以将`map()`的结果展开。
648
654
649
655
在`Optional `里面,当使用`map()`时,如果映射函数返回的是一个普通值,它会将这个值包装在一个新的`Optional `中。而使用`flatMap`时,如果映射函数返回的是一个`Optional `,它会将这个返回的`Optional `展平,不再包装成嵌套的`Optional `。
650
656
651
657
下面是一个对比的示例代码:
652
- ```
658
+
659
+ ```java
653
660
public static void main(String [] args) {
654
661
int userId = 1 ;
655
662
@@ -681,6 +688,7 @@ public static void main(String[] args) {
681
688
System . out. println(" User's city without flatMap: " + cityWithoutFlatMap);
682
689
}
683
690
```
691
+
684
692
在`Stream `和`Optional `中正确使用`flatMap`可以减少很多不必要的代码。
685
693
686
694
### 判断 value 是否为 null
@@ -759,7 +767,7 @@ public Optional<T> filter(Predicate<? super T> predicate) {
759
767
760
768
### 小结
761
769
762
- 看完 `Optional ` 源码,`Optional ` 的方法真的非常简单,值得注意的是如果坚决不想看见 `NPE `,就不要用 `of() `、 `get()`、`flatMap(.. )`。最后再综合用一下 `Optional ` 的高频方法。
770
+ 看完 `Optional ` 源码,`Optional ` 的方法真的非常简单,值得注意的是如果坚决不想看见 `NPE `,就不要用 `of()`、 `get()`、`flatMap(.. )`。最后再综合用一下 `Optional ` 的高频方法。
763
771
764
772
```java
765
773
Optional . ofNullable(zoo). map(o - > o. getDog()). map(d - > d. getAge()). filter(v- > v== 1 ). orElse(3 );
@@ -1002,7 +1010,7 @@ System.out.println(date);
1002
1010
// Wed Jan 27 14:05:29 CST 2021
1003
1011
```
1004
1012
1005
- 在新特性中引入了 `java.time. ZonedDateTime ` 来表示带时区的时间。它可以看成是 `LocalDateTime + ZoneId `。
1013
+ 在新特性中引入了 `java.time. ZonedDateTime ` 来表示带时区的时间。它可以看成是 `LocalDateTime + ZoneId `。
1006
1014
1007
1015
```java
1008
1016
// 当前时区时间
0 commit comments