option . flatmap()和option .map()这两个方法之间有什么区别?
请举例说明。
option . flatmap()和option .map()这两个方法之间有什么区别?
请举例说明。
当前回答
它们都从可选类型中取一个函数。
Map()在你拥有的可选对象上应用函数"as is":
if (optional.isEmpty()) return Optional.empty();
else return Optional.of(f(optional.get()));
如果你的函数是T ->可选<U>的函数会发生什么? 你的结果现在是一个Optional<Optional<U>>!
这就是flatMap()的意义所在:如果你的函数已经返回了一个Optional, flatMap()会更聪明一点,不会将它双换行,返回Optional<U>。
它是map和flatten这两个功能习语的组合。
其他回答
对我有帮助的是查看这两个函数的源代码。
映射将结果包装在可选对象中。
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value)); //<--- wraps in an optional
}
}
flatMap -返回'raw'对象
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Objects.requireNonNull(mapper.apply(value)); //<--- returns 'raw' object
}
}
它们都从可选类型中取一个函数。
Map()在你拥有的可选对象上应用函数"as is":
if (optional.isEmpty()) return Optional.empty();
else return Optional.of(f(optional.get()));
如果你的函数是T ->可选<U>的函数会发生什么? 你的结果现在是一个Optional<Optional<U>>!
这就是flatMap()的意义所在:如果你的函数已经返回了一个Optional, flatMap()会更聪明一点,不会将它双换行,返回Optional<U>。
它是map和flatten这两个功能习语的组合。
Optional.map ():
获取每个元素,如果值存在,则将其传递给函数:
Optional<T> optionalValue = ...;
Optional<Boolean> added = optionalValue.map(results::add);
现在added有三个值之一:true或false包装成Optional(如果optionalValue存在),否则为空Optional。
如果你不需要处理结果,你可以简单地使用ifPresent(),它没有返回值:
optionalValue.ifPresent(results::add);
可选):flatMap。(
工作原理类似于流的相同方法。使溪流变平。不同之处在于,如果值被呈现,它将被应用于函数。否则,返回一个空的可选项。
您可以使用它来组合可选值函数调用。
假设我们有一些方法:
public static Optional<Double> inverse(Double x) {
return x == 0 ? Optional.empty() : Optional.of(1 / x);
}
public static Optional<Double> squareRoot(Double x) {
return x < 0 ? Optional.empty() : Optional.of(Math.sqrt(x));
}
然后你可以计算逆函数的平方根,比如:
Optional<Double> result = inverse(-4.0).flatMap(MyMath::squareRoot);
或者,如果你喜欢:
Optional<Double> result = Optional.of(-4.0)
.flatMap(MyMath::inverse)
.flatMap(MyMath::squareRoot);
如果inverse()或squareRoot()返回Optional.empty(),则结果为空。
你可以参考下面的链接来详细了解(这是我能找到的最好的解释):
https://www.programmergirl.com/java-8-map-flatmap-difference/
map和flatMap - accept函数。map()的返回类型是单个值,而flatMap是返回值流
<R> Stream<R> map(Function<? super T, ? extends R> mapper)
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
如果函数返回需要的对象,则使用map;如果函数返回Optional,则使用flatMap。例如:
public static void main(String[] args) {
Optional<String> s = Optional.of("input");
System.out.println(s.map(Test::getOutput));
System.out.println(s.flatMap(Test::getOutputOpt));
}
static String getOutput(String input) {
return input == null ? null : "output for " + input;
}
static Optional<String> getOutputOpt(String input) {
return input == null ? Optional.empty() : Optional.of("output for " + input);
}
这两个print语句输出的是相同的东西。