ラムダ式を使用して要素が存在するかどうかを確認するにはどうすればよいですか?


118

具体的には、TabPaneがあり、その中に特定のIDを持つ要素があるかどうかを知りたいです。

だから、私はJavaのラムダ式でこれをしたいと思います:

boolean idExists = false;
String idToCheck = "someId";

for (Tab t : tabPane.getTabs()){
    if(t.getId().equals(idToCheck)) {
        idExists = true;
    }
}

回答:


273

anyMatchラムダ式を使用してみてください。それははるかに良いアプローチです。

 boolean idExists = tabPane.getTabs().stream()
            .anyMatch(t -> t.getId().equals(idToCheck));

11
また、注目に値します。チェックを無効にする場合は、のnoneMatch代わりに使用しますanyMatch
Blacklight 2018

通話にはAPIレベル24が必要
FabioLux 2019

50

受け入れられた答えは正しいですが、私は(私の意見では)よりエレガントなバージョンを追加します。

boolean idExists = tabPane.getTabs().stream()
    .map(Tab::getId)
    .anyMatch(idToCheck::equals);

を適用する前にデータ構造をフラット化できるStream#map()の使用をお忘れなくPredicate


3
ここで何が良いですか?もう1つの操作しか表示されません。すいません、このランバの事は初めてです。
TecHunter 2017

2
@TecHunterより明示的です。このコードを初めて読んだり、しばらくしてからもう一度読んだりするとします。いくつかの利点があります。まず、実際にはタブではなく、タブのマッピングに関心があることをすぐに示します。次に、メソッド参照を使用することで(最初のラムダを2つのステップに分割するためにのみ可能です)、コードにサプライズが隠されていないことを示します。3番目に、メソッド参照を使用することで、新しいPredicateを作成せず、実際に再利用しますequals。当然のことながら、ここでの例は非常に単純ですが、私が意味するところを理解していただければ幸いです。
Malte Hartwig、

@MalteHartwigありがとう!ええ、私はあなたの3ポイントを獲得しましたが、での平坦化について尋ねていましたmap、それは別の処理ステップですか?2つの方法を比較してみます:)
TecHunter

1
@MalteHartwigは、最後の要素を見つけようとする単純なオブジェクトを使用して、10kk ArrayListでテストされました。あなたの133msに対して131msの2msの違いを与えます。1kk配列では、2ms(55msから53ms)速い場合は自分のものをリストします。したがって、私たちはあなたの方が優れていると言えます:)
TecHunter

2
@TecHunterゲッターは非常に安価です。余分な2ミリ秒を節約するよりも、常にコードの明快さを優先してください(ただし、結果が正確ではないので、実行するたびに変動する可能性があります)。さらに、ストリームなどの中間操作(などmap)は本質的に遅延であることを覚えておいてください。つまり、getIdメソッドはコレクションの各要素に適用されません。trueanyMatchが返されるまで、遅延評価されます
jFrenetic

3

上記の回答では、新しいストリームオブジェクトをmallocする必要があります。

public <T>
boolean containsByLambda(Collection<? extends T> c, Predicate<? super T> p) {

    for (final T z : c) {
        if (p.test(z)) {
            return true;
        }
    }
    return false;
}

public boolean containsTabById(TabPane tabPane, String id) {
    return containsByLambda(tabPane.getTabs(), z -> z.getId().equals(id));
}
...
if (containsTabById(tabPane, idToCheck))) {
   ...
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.