適切NPE-安全なストリームを作成する方法 - Javaの8ストリーム

ohwelppp:

先週は今、私はストリームを使用した場合NPEと過安全であるように感じているので、右のトラブルの私の多くを引き起こしたストリームに非常に奇妙なNPEを得ました。

ここに私の方法は、今あります:

private boolean matchSomeError(final List<ErrorAtMessageLevel> errorList) {
    return errorList.stream()
        .filter(errorAtMessageLevel -> errorAtMessageLevel.getErrorSegment() != null && errorAtMessageLevel.getErrorSegment().getErrorDetails() != null)
        .map(errorAtMessageLevel -> errorAtMessageLevel.getErrorSegment().getErrorDetails())
        .anyMatch(errorDetails -> SOME_FANCY_ERROR_CODE.equals(errorDetails.getErrorCode()));
}

私の問題は、私はそれを変更し、私は自分のコードを調整する必要があるので、それがnullで安全にすることはできませんので、私はここに外部のPOJOを扱ってるということです。

ここではいくつかの制限事項は次のとおりです。1)errorList -への呼び出しはので、ここでnullにすることはできません.stream()、それはそれだけで偽の2を返します空のとき) -安全であるgetErrorSegment()getErrorDetails()、なぜ私はそれらの確かどれをしないためにそのようにフィルタを使用していますthaのヌルすることができ、両方のnullの3)であるgetErrorCode()私が罰金を- nullにすることができますが、nullと一致するとき、それは単にfalseを返しますので、それがNPEをスローすることはありませんが。

どのようにして、より良い、そのストリームを作りに行きますか?私は私のように感じ.filter()悪いですし、それがよりよい作ることができます。私は確かもうストリームがヌルで働いているし、中にNPEを取得する必要はありませんかじゃないので、最近はそのようなコードの多くを書く.map()ことがヌルに呼ばれていますので、

彼らは次のとおりでした:

あなたはフィルタリングすることができnull、よりエレガントに、このようアウト(S)

private boolean matchSomeError(final List<ErrorAtMessageLevel> errorList) {
    return errorList.stream()
        .map(ErrorAtMessageLevel::getErrorSegment)
        .filter(Objects:nonNull)
        .map(ErrorSegment::getErrorDetails)
        .filter(Objects:nonNull)
        .anyMatch(errorDetails -> SOME_FANCY_ERROR_CODE.equals(errorDetails.getErrorCode()));
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=183213&siteId=1