【发布时间】:2020-03-29 04:02:52
【问题描述】:
为了提高性能,我想在 Java 8 流的 filter() 和 map() 中使用相同的变量。
例子-
list.stream()
.filter(var -> getAnotherObject(var).isPresent())
.map(var -> getAnotherObject(var).get())
.collect(Collectors.toList())
被调用的方法getAnotherObject()看起来像-
private Optional<String> getAnotherObject(String var)
在上述场景中,我必须调用方法 getAnotherObject() 两次。
如果我使用常规 for 循环,那么我必须调用方法 getAnotherObject() 一次。
List<String> resultList = new ArrayList<>();
for(String var : list) {
Optional<String> optionalAnotherObject = getAnotherObject(var);
if(optionalAnotherObject.isPresent()) {
String anotherObject = optionalAnotherObject.get();
resultList.add(anotherObject)
}
}
即使使用流,我也可以将所有代码放入 map()-
list.stream()
.map(var -> {
Optional<String> anotherObjectOptional = getAnotherObject(var);
if(anotherObjectOptional.isPresent()) {
return anotherObjectOptional.get();
}
return null;
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
但我相信一定有一种优雅的方式使用filter()。
【问题讨论】:
-
list.stream().map(var -> getAnotherObject(var)).filter(Optional::isPresent).map(Optional::get).collect(Collectors.toList());(未经测试,我只是不明白为什么这在我脑海中不起作用)。 -
您是否从该解决方案中获得了很多性能提升?
-
你最后的方法还不错。只需将
if(anotherObjectOptional.isPresent()) { return anotherObjectOptional.get(); } return null;替换为.orElse(null)。换句话说,将整个步骤简化为.map(var -> getAnotherObject(var).orElse(null) .filter(Objects::nonNull)。在 Java 9 中,您可以简单地使用.flatMap(var -> getAnotherObject(var).stream()) -
@Kayaman:如果
getAnotherObject()方法正在执行一些重量级的过程,那么它肯定值得避免第二次调用 + 为同一目的两次调用相同的方法是一种不好的做法! -
@Holger :这确实是一个避免
map()链的优雅解决方案......我会试一试......
标签: java filter collections java-8 java-stream