【发布时间】:2021-07-21 07:38:13
【问题描述】:
我有这样的代码:
public void processList(List<String> list) {
for (String item : list) {
Object obj = getObjectForString(item);
if (obj != null) {
doSomethingWithObject(obj);
} else {
System.err.println("Object was null for " + item);
}
}
}
理想情况下,我想简化此操作并避免使用list.stream().map( *blah, blah, blah* ) 进行null 检查,如果对象不是null,则避免使用doSomethingWithObject,但否则记录错误(通过使用orElse 方法可选的)。我对 Java 8 的这个功能不是很精通,也不确定是否有一种很好的、巧妙的方式来做我想做的事情。有什么建议吗?
编辑以添加失败的尝试:
list.stream()
.map(p -> getObjectForString(p))
.map(Optional::ofNullable)
.forEach(
p -> p.ifPresentOrElse(
r -> doSomethingWithObject(r),
() -> System.err.println("Object was null")
));
即使该代码按照我想要的方式运行,它仍然不会像我希望的那样将原始列表中的字符串附加到错误消息中。但也许这太复杂了,无法用这样的流来完成。
【问题讨论】:
-
你有没有尝试过?成为一名优秀的软件开发人员的很大一部分是对事物保持好奇心和主动性,以了解它们是如何工作的。我建议你阅读相关的Javadoc(你似乎对流有基本的掌握,这很好),尝试一些实验,当你发现一些你不理解的行为时,然后提出一个具体的问题。
-
这是一次失败的尝试:` list.stream().map(p -> getObjectForString(p)).map(Optional::ofNullable).forEach( p -> p.ifPresentOrElse( r -> doSomethingWithObject(r), () -> System.err.println("Object was null") ));` 看起来 doSomethingWithObject 为列表中的每个项目调用了两次(包括当对象为空时)。我确实得到了一个空对象的错误消息输出,这很好。但是我也没有按照我的意愿将字符串“项目”附加到我的错误消息中(这可能是最棘手的部分)
-
@Adam,您可以将失败的尝试和相关信息粘贴为问题本身的一部分。
-
映射到
Optional是没有意义的。只需使用.filter(item -> getObjectForString(item) == null) -
传递给
filter的谓词告诉要保留哪些元素。.filter( /* tell which elements should pass */) .forEach( /* tell what to do with the elements that passed the filter */)的逻辑应该很容易理解。但无论如何,看看你的尝试,问问自己,不管它不是那样工作的,这是否比你原来的循环更简单?
标签: java java-stream optional null-check