Cha*_*d K 5 java lambda java-8
我有以下代码:
return myList
.stream()
.filter(Objects::nonNull)
.filter(listItem -> {
try {
return listItem.matchesCondition();
} catch (Exception e) {
// log error
return false;
}
})
.findFirst()
.map(listItem -> {
try {
return listItem.getResult();
} catch (Exception e) {
// IF THIS HAPPENS, HOW CAN WE ADVANCE TO THE NEXT ITEM IN THE STREAM.
// I'M ASSUMING WE CAN NOT SINCE THE STREAM WAS TERMINATED BY findFirst.
// BUT HOW CAN I WRITE THIS IN A DIFFERENT WAY TO ACHIEVE THAT BEHAVIOR?
// log error
return null;
}
});
Run Code Online (Sandbox Code Playgroud)
问题是,如果第一个匹配的listItem在map函数中引发异常,则返回一个空的Optional。
但是,我想继续测试列表中的其余项,并尝试映射与过滤器匹配的下一项。
如何使用流和lambda做到这一点?
我可以转换为更强制性的代码,但希望找到一个功能解决方案。
for (MyListItem myList : listItem) {
try {
if (listItem.matchesCondition()) {
return Optional.of(listItem.getResult());
}
} catch (Exception e) {
// SWALLOW THE EXCEPTION SO THE NEXT ITEM IS TESTED
// log error
}
}
return Optional.empty();
Run Code Online (Sandbox Code Playgroud)
您必须将 移到findFirst最后,因为它将流减少到(最多)一个元素,并且您无法“返回”并获得更多。
return myList
.stream()
.filter(Objects::nonNull)
.filter( ... )
.map( ... ) // returns null on Exception, so filter again
.filter(Objects::nonNull)
.findFirst()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1874 次 |
| 最近记录: |