web-dev-qa-db-ja.com

ラムダ式を使用して要素が存在するかどうかを確認する方法は?

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

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

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

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

Lambda Expressionの anyMatch を使用してみてください。それははるかに良いアプローチです。

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

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

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

Predicateを適用する前にデータ構造をフラット化できる Stream#map() の使用を無視しないでください。

37
jFrenetic

上記の回答では、新しいストリームオブジェクトを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))) {
   ...
}
3
kevinarpe