在Java 8中,我们可以在Optional和Stream经常看到map()和flatMap()这两个方法,这两个方法是针对函数式特性引入的,两者功能上看似相近,但其实还是有很大区别的。让我们来了解一下吧。
Optional中的比较
我们会经常在Optional中使用到map()做对象转化,如下把一个整数转化成它的两倍:
Optional<Integer> num = Optional.of(33);
assertEquals(Optional.of(66),
num.map(i -> i * 2));
然而,在一些更复杂的函数里,可能会返回一个Optional的结果,而不是我们直接需要可用的,就会造成了嵌套结构。看下面的代码来理解一下这种情况:
assertEquals(Optional.of(Optional.of(66)),
Optional.of(33).map(i -> Optional.of(i * 2)));
结果使用map()就返回了一个Optional<Optional<Integer>>嵌套结构的结果。这时候,使用flatMap()能带来不一样的效果:
assertEquals(Optional.of(66),
Optional.of(33).flatMap(i -> Optional.of(i * 2)));
Stream中的比较
这两个方法在Stream中的表现其实也是类似的。</