当map在filter和findFirst之后引发异常时,需要继续过滤Java流

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)

Thi*_*ilo 6

您必须将 移到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)