람다 식을 사용하여 요소가 있는지 확인하는 방법은 무엇입니까?


118

특히 TabPane이 있으며 특정 ID를 가진 요소가 있는지 알고 싶습니다.

따라서 Java에서 람다 식으로 이것을 수행하고 싶습니다.

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

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

답변:


273

anyMatchLambda Expression을 사용해보십시오 . 훨씬 더 나은 접근 방식입니다.

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

11
또한 주목할 가치가 있습니다 : noneMatch대신 anyMatch.
Blacklight

호출에는 API 레벨 24 필요
FabioLux 2019

50

받아 들여지는 대답은 정확하지만 더 우아한 버전을 추가하겠습니다 (내 의견으로는).

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

방치 사용하지 마십시오 스트림 #지도 () 을 적용하기 전에 데이터 구조를 평평하게 할 수 있습니다 Predicate.


3
여기가 더 낫지? 작업이 하나만 더 표시됩니다. 이 람 바가 처음이라 미안합니다.
TecHunter 2017

2
@TecHunter 더 명시 적입니다. 이 코드를 처음 읽거나 잠시 후에 다시 읽었다 고 상상해보십시오. 몇 가지 장점이 있습니다. 첫째, 탭에 실제로 관심이 없다는 것을 즉시 보여 주지만 탭의 일부 매핑에 관심이 있습니다. 둘째, 메서드 참조 (초기 람다를 두 단계로 나누기 때문에 가능함)를 사용하여 코드에 숨겨진 놀라움이 없음을 보여줍니다. 셋째, 메서드 참조를 사용하여 새로운 Predicate를 생성하지 않고 실제로 equals. 당연히 여기의 예는 매우 간단하지만 제 말을 이해하기를 바랍니다.
Malte Hartwig

@MalteHartwig 감사합니다! 네, 3 점을 얻었지만을 (를) 사용하여 평평하게하는 것에 대해 물었 map습니다. 다른 처리 단계를 수행하지 않습니까? 두 가지 방법을 비교해
보겠습니다.

1
@MalteHartwig는 마지막 요소를 찾으려고하는 간단한 개체를 사용하여 10kk ArrayList에서 테스트했습니다. 133ms에 대해 2ms 차이 131ms를 제공합니다. 1kk 어레이에서 2ms (55ms ~ 53ms) 더 빠르면 귀하의 목록을 나열합니다. 그래서 우리는 당신이 더 낫다고 말할 수 있습니다 :)
TecHunter

2
@TecHunter 게터는 매우 저렴합니다. 추가로 2 밀리 초를 절약하는 것보다 항상 코드 명확성을 선호합니다 (결과가 정확하지 않더라도 실행될 때마다 변동될 수 있음). 게다가 스트림에 대한 중간 작업 (예 :) 은 본질적 map으로 게으른 작업 입니다. 즉 getId, 컬렉션의 각 요소에 메서드가 적용되지 않습니다. true를anyMatch 반환 할 때까지 느리게 평가 됩니다.
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.