2

Lambdajを使用して、2つの別々の基準を満たすオブジェクトをリストから分離しようとしています。次の両方が私の目標を達成します。A)

    List<SomeObject> someObjectsWithMatchingSomeObjectIds = select(foo.getSomeParentObject().getSomeObjects(), having(on(
            SomeObject.class).getId(), equalTo(123)));
    SomeObject someObject = selectFirst(someObjectsWithMatchingSomeObjectIds, having(on(SomeObject.class).getLoanTerm(),
            notNullValue()));

B)

    SomeObject someObject = selectFirst(select(foo.getSomeParentObject().getSomeObjects(), having(on(SomeObject.class)
            .getId(), equalTo(123))), having(on(SomeObject.class).getLoanTerm(), notNullValue()));

最初のものは、特にAPIに精通していない人にとっては読みやすいようです。2つ目は、lambdajの関数型プログラミングの側面を利用しているようです。

読みやすさが勝つと思います。ただし、LambdaJを使用してコレクションをフィルタリングするときに、2つの別々の条件を処理するためのより簡潔な方法はありますか?

4

1 に答える 1

8

中間の定義を削除することは、多くの場合「精神的に」ではなく、一般に読みやすさを損ないます。中間定義があると、プログラムの各行が読みやすくなり、識別子に意味のある名前を付けることができる場合に非常に読みやすくなります。コードに実際に当てはまるかどうかはわかりません。

select2つのフィルタリング操作を適用せずに、2つの一致条件を(コードはテストされていないことに注意してください)selectFirstと組み合わせた1つの操作のみを使用することで、読みやすさを向上させることができると思います。and

SomeObject someObject = selectFirst(foo.getSomeParentObject().getSomeObjects(),
                                    and(having(on(SomeObject.class).getId(), equalTo(123)),
                                        having(on(SomeObject.class).getLoanTerm(), notNullValue()));
于 2012-06-23T07:58:29.410 に答える