항상 true를 리턴하는 내장 Java 8 술어?


129

Google Guava에는 항상을 반환true 하는 조건자가 있습니다. Java 8과 비슷한 점이 Predicate있습니까? 나는 사용할 수 있다는 것을 알고 (foo)->{return true;}있지만와 비슷한 물건을 원한다 Collections.emptySet().

답변:


162

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 항목 도 참조하십시오 .


14
두 가지 관심사 : 첫 번째는 간결합니다. (foo)->{return true;}내가 할 수있는 최선 이라면 , 나는 더 나은 것을 원합니다. 그러나 당신 x->true은 훨씬 나아 졌으며 첫 번째 문제를 완화했습니다. 두 번째 문제는 논리 대 정적 선언입니다. 을 사용하면 x->true여전히 논리가 관련되어 있으며 실수로 실수로 조일 수 있습니다 (예 :) x->!true. 그러나로 Predicate.alwaysTrue()인해 유사한 방법이 하나 또는 두 개이므로 논리 오류에 대한 여지가 없습니다. 또한 무료로 IDE 코드 완성을 얻습니다. x->true거의 괜찮지 만 Predicate.alwaysTrue()위의 이유로 여전히 방법을 작성했습니다 .
Garret Wilson

10
@GarretWilson 그러나 Predicate.alwaysTrue()실수로 글을 쓰면 망할 수도있다 Predicate.alwaysFalse().
David Conrad

5
물론 @DavidConrad. 실수를 할 수있는 방법은 항상 있으며 실제로는 새로운 실수를 끊임없이 발명하고 있습니다. ;) 나는 사소한 뭔가 이상 여기에 인수를 시작하고 싶지 않아,하지만 난 그냥 내 포인트는 정적 메소드를 참조하여 내가 제한된 어휘 만 두 가지 선택이 있다는 것을 말할 것이다 : alwaysTrue()alwaysFalse(). 실제 람다에는 많은 변형이 있습니다. 나는 매번 공식을 재구성하고 있습니다. 본질적으로, alwaysTrue()내가하고 싶은 일 에 대한 의미 레이블입니다. x->true실제로 매번 다시 수행하고 있습니다. 크지는 않지만 고려할 사항입니다.
Garret Wilson

25
표준의 하나의 큰 장점 Predicate.alwaysTrue()Predicate.alwaysFalse()인스턴스는이 같은 방법을 결합하여 인식 될 수있다 Predicate.or, Predicate.and하고 Predicate.negate(). 이를 통해 오버 헤드없이 via 를 결합하여 Predicate변수 를 사전 초기화 alwaysTrue()하고 술어를 추가 할 수 있습니다 and. 람다 식에는 개체 ID 보증이 없으므로 이로 인해 실패 할 수 있습니다 x->true. 그건 그렇고, 내가 수업 X이있는 static방법 이 있다면 y(){return true;}사용하는 X::y것이 훨씬 짧지 x->true만 실제로 권장되지는 않습니다…
Holger

10
관용구 x -> true는 변수를 사용하지 않고 사용해야한다는 단점이 있습니다. 이것은 불필요한 두뇌 부하와 IDE에 경고를 생성합니다. 을 사용하려고했지만 _ -> true구문 오류입니다. Java에 "사용되지 않은 매개 변수"에 대한 키워드 (읽기 : 키 레터)가 누락되었습니다. 이와 같은 것이 Java 9 (또는 적어도 죽을 때까지 Java ^^)에 올 수 있기를 바랍니다.
kap

4

구아바없이

Boolean.TRUE::booleanValue

3
그 흥미 롭군요. 그것이 요청의 정신을 완전히 포착하는지 확실하지 않지만 창의력에 대한 포인트를 얻습니다!
Garret Wilson

21
그러나 Predicate인수를 취하지 않기 때문에는 아닙니다.
Florent Guillaume

1
술어가 아니며 메소드 참조이지만 간결하고 사용되지 않는 매개 변수를 언급하지 않는 장점이 있습니다. +1 그건 그렇고, 모듈화에 심각한 문제가있는 구아바를 사용하지 않기 때문에 저의
공감대

16
메소드 참조는 Supplier <Boolean>에 지정할 수 있지만 Predicate <T>에는 지정할 수 없습니다
Daniel K.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.