java-转换Guava可选,可能返回null
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-转换Guava可选,可能返回null,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3662字,纯文字阅读大概需要6分钟。
内容图文
![java-转换Guava可选,可能返回null](/upload/InfoBanner/zyjiaocheng/668/6b531a854b824c91b99a48b11175537a.jpg)
TL; DR
使用可能返回null的函数来转换Guava Optional的最佳方式(即最紧凑/最易读)是什么? (因此,在这种情况下,我们应该获得Optional.absent()而不是NPE.)
额外的问题:如果变换器函数返回null,则以番石榴的方式存在优势,即抛出NPE吗? (而不是像Java 8 Optionals那样,将其转换为Optional.absent().)还是这仅仅是设计的一个缺点?
问题
按照documentation of Guava Optional.transform:
Comparison to java.util.Optional: this method is similar to Java 8’s
Optional.map
, except when function returnsnull
. In this case this
method throws an exception, whereas the Java 8 method returns
Optional.absent()
.
例
这两个示例共有以下功能:
public String methodThatMighReturnNull(boolean returnNull, Integer input) {
return returnNull ? null : String.valueOf(input);
}
对于Java 8,这不会引发NPE,但会返回空的Optional:
Optional<Integer> input = Optional.of(42);
Optional<String> result = input.map(new Function<Integer, String>() {
public String apply(Integer input) {
return methodThatMighReturnNull(true, input);
}
});
以下与Guava相似的代码将引发NPE:
Optional<Integer> input = Optional.of(42);
Optional<String> result = input.transform(new Function<Integer, String>() {
public String apply(Integer input) {
return methodThatMighReturnNull(true, input);
}
});
可能的选择
我已经找到/考虑了一些替代方案,但是,如下所述,它们都是有问题的:
>将返回值包装到Optional中.问题:太笨重,更难以阅读;
Optional<Integer> input = Optional.of(42);
Optional<String> result = input.transform(new Function<Integer, Optional<String>>() {
public Optional<String> apply(Integer input) {
return fromNullable(methodThatMighReturnNull(true, input));
}
}).get();
>通过检查ifPresent使用if / else.问题:一种杀害点是Optional. (我们可以只使用引用并检查是否为null.)
Optional<Integer> input = Optional.of(42);
Optional<String> result;
if (input.isPresent()) {
result = fromNullable(methodThatMighReturnNull(true, input.get()));
} else {
result = Optional.absent();
}
>仅应用函数,并将其包装在fromNullable中. (如在GitHub上发现的,似乎已经引起了同样的问题.)问题:这与原始示例稍有不同.在这种情况下,methodThatMighReturnNull可能最终收到null,而在原始情况下,这是不可能的.
Optional<Integer> input = Optional.of(42);
Optional<String> result;
result = fromNullable(new Function<Integer, String>() {
public String apply(Integer input) {
return methodThatMighReturnNull(true, input);
}
}.apply(input.orNull()));
解决方法:
除了您在问题中列出的替代方案之外,还有两种其他可能性:
>如果您使用的是Java 8或更高版本,则从Guava 21.0开始,您将拥有Optional.toJavaUtil()实例方法,该方法将Guava Optional实例转换为java.util.Optional实例,还有Optional.fromJavaUtil静态方法,该方法从Java创建了Guava Optional实例. util.可选的.
您可以使用它们让java.util.Optional采用一个以其自身的语义调用其Optional.map方法中的方法的函数(如果该函数返回null,则不会抛出NullPointerException,而是返回一个空的java.util.Optional). .然后,如果需要,可通过Optional.fromJavaUtil方法将此映射的java.util.Optional转换回Guava Optional.
这是显示此方法的代码:
Optional<Integer> input = Optional.of(42);
java.util.Optional<String> temp = input.toJavaUtil()
.map(i -> methodThatMighReturnNull(true, i));
Optional<String> result = Optional.fromJavaUtil(temp);
>如果您还没有使用Java 8或更高版本(或者,如果您不喜欢以前的方法),我将为您提供第二种选择的变体.为此,我将使用所需的语义实现一个transformNullSafe方法:
public static <T, R> Optional<R> transformNullSafe(
Optional<T> optional,
Function<T, R> function) {
if (optional.isPresent()) {
return Optional.fromNullable(function.apply(optional.get()));
} else {
return Optional.absent();
}
}
用法:
Optional<Integer> input = Optional.of(42);
Optional<String> result = transformNullSafe(
input,
new Function<Integer, String>() {
public String apply(Integer i) {
return methodThatMighReturnNull(true, i);
}
});
内容总结
以上是互联网集市为您收集整理的java-转换Guava可选,可能返回null全部内容,希望文章能够帮你解决java-转换Guava可选,可能返回null所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。