Set
인터페이스는 구현시 null
요소가 허용되는지 여부에 대해 약속하지 않습니다. 각 구현은 문서에서 이것을 선언해야합니다.Java의 Collectors.toSet()은 null을 허용 할 수 있습니까?
Collectors.toSet()
은 Set
의 구현을 반환 하겠지만 "명시 적으로"Set
의 유형, 변경 가능성, serializability 또는 스레드 안전성에 대한 보장이 없음 "을 약속합니다. 무효 안전은 언급되지 않았다.
현재 OpenJDK의 Collectors.toSet()
구현은 null 요소를 허용하는 HashSet
을 항상 사용하지만 향후 변경 될 수 있으며 다른 구현은 다르게 수행 될 수 있습니다. Set
구현 null
요소를 금지하는 경우
, 그것은 add(null)
을 시도하는 동안 특히, 여러 번 NullPointerException
가 발생합니다. Collectors.toSet()
이 null-intolerant Set
구현을 사용하기로 결정한 경우 에 stream.collect(Collectors.toSet())
을 호출하면 문제가되는 것으로 보입니다. collect
의 사양에는 예외가 나열되어 있지 않으며 Collector
메서드 중 하나의 사양도 나와 있지 않습니다. 이것은 collect
호출이 stream
내에서 널을 허용한다는 것을 제안 할 수 있지만, 반면에 NullPointerException
은 엄격히 나열 할 필요가 없으므로 이것이 실제로 많은 것을 의미하는지 명확하지 않습니다.
다른 곳에서는 더 명확하게 지정되어 있습니까? 특히 다음 코드는 던지지 않도록 보장됩니까? true
을 돌려 주겠습니까? 그렇지 않으면
import java.util.stream.*;
class Test {
public static boolean setContainsNull() {
return Stream.of("A", "list", "of", null, "strings")
.collect(Collectors.toSet())
.contains(null);
}
}
, 그럼 나는 우리가 항상 스트림
Collectors.toSet()
를 사용하거나
NullPointerException
을 처리 할 준비가되기 전에 더 널 (null)을 포함하지 않는 확인해야합니다 가정합니다. (이 예외만으로도 충분합니까?) 또는 허용되지 않거나 어렵다면
Collectors.toCollection(HashSet::new)
과 같은 코드를 사용하여 특정 세트 구현을 요청할 수 있습니다.
편집 :existing question 외면적으로 비슷하게 들리는이 질문은 그 것으로 추정되는 복제본으로 마감되었습니다. 그러나 링크 된 질문은 Collectors.toSet()
을 전혀 다루지 않습니다. 또한, 그 질문에 대한 대답은 가정 질문 내 질문의 양식을 형성합니다. 그 질문은 묻습니다 : 스트림에 null이 허용됩니까? 예. 그러나 null을 포함하는 (완벽하게 허용되는) 스트림이 표준 수집기를 통해 수집되면 어떻게됩니까? null
지원 등 "형, 가변성, 직렬화, 또는 스레드 안전"과 underspecified 행동과 같은 의도적으로 지정되지 않은 행동의 차이는,이
언급되지 않았지만 NULL을 허용하지 않으면 그다지 나쁜 형식이 아니며 아무 말도하지 않았다고 생각합니다. –
@SleimanJneidi 당신이 링크 한 질문은 표준 수집가와 아무 관련이 없습니다. 이는 제가 묻고있는 것입니다. 스트림에 널 (null)을 포함 할 수 있는지 물어 봅니다. (질문은 당연한 것입니다.) 그리고 NPE를 피하기 위해 널을 포함하는 스트림에 명시 적으로 널 (null) 허용하지 않는 코드를 적용 할 수있는 마법이 있는지 여부를 묻습니다. 'collect (Collectors.toSet())'는 명시 적으로 null을 허용하지 않는 코드가 아닙니다. 그렇지 않으면 필자는 정확하게 그것이 맞는지 여부를 묻습니다. –
지정하지 않았으므로 어느 쪽이든 추측하지 않습니다. null 값이 가능성이 있다는 것을 알고 있다면, 나는 항상 완전히 안전하기 위해'toCollection (HashSet :: new)'를 사용할 것입니다. – VGR