최근에 저는 새로운 java8 기능에 대해 더 잘 이해하고 있습니다. : object -> targetRef.equals(object);
: 나를 의심이 줄이었다 만든 무엇Predicate.isEqual이 구현 된 이유는 무엇입니까?
/**
* Returns a predicate that tests if two arguments are equal according
* to {@link Objects#equals(Object, Object)}.
*
* @param <T> the type of arguments to the predicate
* @param targetRef the object reference with which to compare for equality,
* which may be {@code null}
* @return a predicate that tests if two arguments are equal according
* to {@link Objects#equals(Object, Object)}
*/
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
: Stream.filter
에 몇 가지 물건을하려고 할 때
나는 내가 isEqual
방법의 다음과 같은 구현을 발견하는 Predicate.java
의 소스를 가로 질러왔다.
은 어쩌면 내가 다량이 지나친하고 있지만, 그 선이 같은 : targetRef::equals;
되지 않은 이유를 나는 즉시 생각을 떨칠 수 없었다 :
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: targetRef::equals;
}
그렇지 않으면 나에게 람다의 불필요한 생성을 보인다.
내가 뭔가를 놓치지 않는다면 나에게도 마찬가지입니다. (그들은 똑같은가?) 현재 구현이 선택된 이유가 있습니까? 아니면이게 그냥 믿을 수 없을만큼 작아서 그냥 간과했거나 아무도 정말로 신경 쓰지 않았습니다.
사실상 보너스 질문이 발생합니다. 다른 편도를 사용하는 데 어떤 이점이 있습니까? 어떤 종류의 (아마도 아주 작은) 성과 보너스와 마찬가지로?
방법 참조는 명시 적 람다와 동일한 연삭 기계에서 끝납니다. 두 가지 모두에 대해 동일한 구현 기술이 필요합니다. –
@MarkoTopolnik 예, 메소드 참조를 전달하는 대신 lamba (메소드를 호출하는 것만으로)를 작성하여 불필요한 메소드 호출 (람다)을 체인에 추가하지 않습니까? (아마 스트림에 많은 아이템이 포함되어 있다면 많이 불려질 것입니다.) –
아무에게도 대답 할 수 없을 것입니다 ... 코드를 작성한 사람을 기대하십시오. 확신. – Tunaki