1. ホーム

[解決済み】Java List.contains(Object with field value equal to x)

2022-04-17 18:31:49

質問

をチェックしたい。 List は、特定の値を持つフィールドを持つオブジェクトを含んでいます。ループを使ってチェックすることもできますが、もっと効率的なコードはないものかと考えていました。

のようなものです。

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

上記のコードは何もしていないことは分かっていますが、私が実現しようとしていることを大まかに示すためのものです。

また、単純なループを使いたくない理由は、このコードは現在、ループの中のループの中に入っていて、そのループの中のループの中に入っているためです。可読性を高めるために、ループの中にループを追加し続けたくありません。そこで、何かシンプルな代替手段がないかと考えていました。

どのように解決するのですか?

ストリーム

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> が含まれています。 MyObject という名前で name . のそれぞれに対して操作を行いたい場合は、以下のようになります。 MyObject その getName().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 -> o.getName().equals(name));
}