Google Guava에는 항상을 반환true
하는 조건자가 있습니다. Java 8과 비슷한 점이 Predicate
있습니까? 나는 사용할 수 있다는 것을 알고 (foo)->{return true;}
있지만와 비슷한 물건을 원한다 Collections.emptySet()
.
답변
Java 8에는 내장 된 항상 참 및 항상 거짓 술어가 없습니다. 이것을 작성하는 가장 간결한 방법은 다음과 같습니다.
x -> true
과
x -> false
이것과 비교
Predicates.alwaysTrue() // Guava
그리고 마지막으로 익명의 내부 클래스에 :
new Predicate<Object>() {
public boolean test(Object x) {
return true;
}
}
아마도 구아바에 이러한 내장 술어가있는 이유는 익명의 내부 클래스에 대한 정적 메소드 호출의 구문 상 이점이 있기 때문입니다. Java 8에서는 람다 구문이 너무 간결 하여 정적 메소드 호출을 작성 하는 데 구문상의 단점 이 있습니다.
그러나 그것은 단지 구문 비교입니다. 단일 글로벌 상시 참 술어가있는 x -> true
경우 여러 클래스에 걸쳐 발생 하는 발생 과 비교하여 각각 고유 한 술어 인스턴스를 작성하는 경우 와 비교하여 작은 공간 이점이있을 수 있습니다. 이것이 당신이 걱정하는 것입니까? 저축은 설득력이 없어 보였으므로 아마도 처음에는 추가되지 않았을 것입니다. 그러나 향후 릴리스를 위해 다시 고려 될 수 있습니다.
업데이트 2015-04-24
우리는 정적의 다양한 또한 같은 이름 지정된 함수로 간주 한 Predicate.alwaysTrue
, Runnable.noop
등, 우리는 자바 SE의 향후 버전에서 더 이상 추가하지 않기로 결정했다.
확실히 이름 대 기록 된 람다가있는 무언가에는 가치가 있지만이 가치는 아주 작습니다. 우리는 사람들이 읽기 및 쓰기 방법을 배울 것으로 기대 x -> true
하고 () -> { }
그들의 사용이 관용적이 될 것입니다. Function.identity()
오버 의 가치조차도 x -> x
의문의 여지가 있습니다.
작성된 람다를 평가하는 대신 기존 함수를 재사용하면 성능상의 이점이 적지 만, 이러한 유형의 함수 사용이 너무 작아 API 이점이없는 것은 분명합니다.
Holger는 또한 작성된 기능 등을 최적화 할 가능성을 언급했다 Predicate.or
. 이것은 또한 JDK-8067971 로 간주되었지만 다소 취약하고 오류가 발생하기 쉬운 것으로 여겨 졌으며 , 구현하기 위해 노력할 가치가 없을 정도로 자주 발생했습니다.
이 Lambda FAQ 항목 도 참조하십시오 .
답변
구아바없이
Boolean.TRUE::booleanValue