현재 메소드 참조와 반대 인 메소드 참조를 작성하는 방법이 있습니다. 아래의 @vlasec의 답변을 참조하여 메소드 참조를 a로 명시 적으로 캐스팅 Predicate
한 다음 negate
함수를 사용하여 변환 하는 방법을 보여줍니다 . 그렇게하는 몇 가지 다른 방법 중 하나입니다.
이것의 반대 :
Stream<String> s = ...;
int emptyStrings = s.filter(String::isEmpty).count();
이것입니다 :
Stream<String> s = ...;
int notEmptyStrings = s.filter(((Predicate<String>) String::isEmpty).negate()).count()
아니면 이거:
Stream<String> s = ...;
int notEmptyStrings = s.filter( it -> !it.isEmpty() ).count();
개인적으로, 나는 it -> !it.isEmpty()
장황한 명시 적 캐스트보다 읽는 것이 더 명확하고 부정 하기 때문에 나중의 기술을 선호합니다 .
술어를 만들어 재사용 할 수도 있습니다.
Predicate<String> notEmpty = (String it) -> !it.isEmpty();
Stream<String> s = ...;
int notEmptyStrings = s.filter(notEmpty).count();
또는 컬렉션이나 배열이있는 경우 간단하고 오버 헤드가 적고 * 더 빠를 수있는 for 루프를 사용하십시오.
int notEmpty = 0;
for(String s : list) if(!s.isEmpty()) notEmpty++;
* 빠른 것이 무엇인지 알고 싶다면 JMH http://openjdk.java.net/projects/code-tools/jmh 를 사용 하고 모든 JVM 최적화를 피하지 않는 한 핸드 벤치 마크 코드를 피하십시오 ( Java 8 : Streams의 성능 참조) . vs 컬렉션
** for-loop 기술이 더 빠르다는 제안에 착각했습니다. 스트림 작성을 제거하고 다른 메소드 호출 (조건 자에 대해 음수 함수)을 사용하지 않고 임시 누적 기 목록 / 카운터를 제거합니다. 따라서 마지막 구성으로 저장되는 몇 가지 사항은 더 빠를 수 있습니다.
그래도 더 빠르지는 않더라도 더 간단하고 훌륭하다고 생각합니다. 직업이 망치와 못을 요구하는 경우 전기 톱과 접착제를 가져 오지 마십시오! 나는 당신 중 일부가 그 문제를 안다는 것을 알고 있습니다.
희망 목록 : Stream
Java 사용자가 익숙해지면서 Java 기능이 조금 발전하고 싶습니다 . 예를 들어 Stream의 'count'메서드는 Predicate
다음과 같이 직접 수행 할 수 있도록 허용 할 수 있습니다.
Stream<String> s = ...;
int notEmptyStrings = s.count(it -> !it.isEmpty());
or
List<String> list = ...;
int notEmptyStrings = lists.count(it -> !it.isEmpty());
Predicate.not(Predicate)
메소드 추가를 다룹니다 . 그러나이 문제는 여전히 열려 있으므로 Java 12에서 가장 빨리 볼 수 있습니다.