Java List.contains(フィールド値がxに等しいオブジェクト) 質問する

Java List.contains(フィールド値がxに等しいオブジェクト) 質問する

特定の値を持つフィールドを持つオブジェクトがa に含まれているかどうかを確認したいと思いますList。ループを使用して確認することもできますが、より効率的なコードがあるかどうか知りたいと思いました。

何かのようなもの;

if(list.contains(new Object().setName("John"))){
    //Do some stuff
}

上記のコードは何も実行しないことは承知していますが、これは私が何を達成しようとしているのかを大まかに示すだけです。

また、明確にしておくと、単純なループを使用したくない理由は、このコードが現在、ループ内のループ内のループ内に入るためです。読みやすさのために、これらのループにループを追加し続けたくありません。そこで、何か単純な(ish)代替手段があるのではないかと考えました。

ベストアンサー1

ストリーム

Java 8 を使用している場合は、次のようなことを試してみてください。

public boolean containsName(final List<MyObject> list, final String name){
    return list.stream().filter(o -> o.getName().equals(name)).findFirst().isPresent();
}

あるいは、次のような方法を試すこともできます。

public boolean containsName(final List<MyObject> list, final String name){
    return list.stream().map(MyObject::getName).filter(name::equals).findFirst().isPresent();
}

このメソッドは、 に という名前の が含まれているtrue場合にを返します。のそれぞれの に対して操作を実行する場合は、次のようにします。List<MyObject>MyObjectnameMyObjectgetName().equals(name)

public void perform(final List<MyObject> list, final String name){
    list.stream().filter(o -> o.getName().equals(name)).forEach(
            o -> {
                //...
            }
    );
}

はインスタンスoを表しますMyObject

あるいは、コメントが示唆しているように (MK10 さん、ありがとうございます)、次のStream#anyMatch方法を使用することもできます。

public boolean containsName(final List<MyObject> list, final String name){
    return list.stream().anyMatch(o -> name.equals(o.getName()));
}

おすすめ記事