기본 구현을 사용하는 null-safe 매핑 비교기
자체 구현을 작성하지 않고 Java 8에서 null-safe 매핑 비교기를 만들 수있는 내장 가능성이 Comparator
있습니까?
다음 코드를 실행하면의 keyExtractor
인수가 값을 Comparator.comparing()
반환 할 수 있으므로 NPE가 발생 null
합니다.
public class ToSort
{
private String sortBy;
public ToSort(String sortBy)
{
this.sortBy = sortBy;
}
public String getSortBy()
{
return sortBy;
}
public static void main(String[] args)
{
// mapping comparator
Comparator<ToSort> comp = Comparator.comparing(ToSort::getSortBy);
SortedSet<ToSort> set = new TreeSet<>(comp);
ToSort o1 = new ToSort("1");
ToSort o2 = new ToSort(null);
set.add(o1);
System.out.println(set.contains(o2)); //NPE because o2.getSortBy() == null
}
}
java.util.Comparator.lambda $ comparing $ 77a9974f $ 1 (Comparator.java:469)의 스레드 "main"java.lang.NullPointerException에서 java.util.Comparator $$ Lambda $ 2 / 1480010240.compare (Unknown Source)의 예외 java.util.TreeMap.getEntryUsingComparator (TreeMap.java:376) at java.util.TreeMap.getEntry (TreeMap.java:345) at java.util.Comparators $ NullComparator.compare (Comparators.java:83) at java.util.TreeMap.getEntry (TreeMap.java:345) at java.util. .TreeMap.containsKey (TreeMap.java:232) at java.util.TreeSet.contains (TreeSet.java:234) at test.ToSort.main (ToSort.java:48)
사용
Comparator<ToSort> comp = Comparator.nullsFirst(Comparator.comparing(ToSort::getSortBy));
제대로 밟힌 ToSort
물체 로만 작동하지 않습니다 null
.
나는 내 자신의 Comparator
구현 을 작성하는 방법을 알고있다 . 나는 단지 더 "우아한"해결책을 찾고있다.
Comparator.comparingNullsFirst(ToSort::getSortBy)
가능한 해결책을 찾았습니다.
Comparator.comparing(ToSort::getSortBy,
Comparator.nullsFirst(Comparator.naturalOrder())
)
'Development Tip' 카테고리의 다른 글
TV 소음처럼 보이도록 캔버스 애니메이션 (0) | 2020.12.04 |
---|---|
http 응답 본문 (json) 만 출력하고 다른 헤더는 출력하지 않도록 curl을 얻는 방법 (0) | 2020.12.04 |
어떤 키 / 값 저장소가 가장 유망하고 안정적인가요? (0) | 2020.12.04 |
테이블의 모든 열과 ROWNUM과 같은 추가 열을 어떻게 선택합니까? (0) | 2020.12.04 |
IE8을 사용하는 첫 번째 자식 및 마지막 자식 (0) | 2020.12.04 |