2014-04-11 3 views

답변

138

시도는 람다 식의 anyMatch을 사용합니다. 훨씬 더 나은 접근법입니다.

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

허용 대답이 정확하지만, 나는 (내 생각에) 더 우아한 버전을 추가 할 것입니다 :

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

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

+2

무엇이 더 좋습니까? 나는 단지 한 번 더 조작을 본다. 미안 해요,이 람바 일은 처음이에요. – TecHunter

+2

@TecHunter보다 명확합니다. 처음으로이 코드를 읽거나 잠시 후에 다시 읽는다고 가정 해보십시오. 몇 가지 장점이 있습니다. 첫째, 우리는 실제로 탭에 관심이 없다는 것을 즉각적으로 보여줍니다. 둘째, 메서드 참조를 사용하여 (초기 람다를 두 단계로 나눌 수 있기 때문에 가능함) 코드에 숨은 놀라움이 없다는 것을 보여줍니다. 셋째, 메소드 참조를 사용하여 새로운 술어를 작성하지는 않지만 실제로는 'equals'를 다시 사용합니다. 물론이 예제는 매우 간단하지만, 내가 의미하는 바를 얻을 수 있기를 바랍니다. –

+0

@MalteHartwig 감사합니다! 네, 3 점을 얻었지만'map'으로 평탄화에 대해 물어 보았습니다. 또 다른 처리 단계가 있습니까? 나는 2 가지 방법을 비교하려고 할 것이다. – TecHunter

0

위의 답변을 사용하려면 새로운 스트림 객체를 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))) { 
    ... 
} 
관련 문제