null 값에 대해 jdk8 스트림을 관리하는 방법
그 주제가 좀 그렇다는 거 알아요in advance
JDK8이 아직 출시되지 않았기 때문에 (아직은 발매되지 않았습니다.그러나 나는 람다 표현, 특히 Stream으로 알려진 새로운 컬렉션 API와 관련된 몇 가지 기사를 읽고 있었다.
Java Magazine 기사에 기재된 예를 다음에 나타냅니다(이것은 수달 개체수 알고리즘입니다).):
Set<Otter> otters = getOtters();
System.out.println(otters.stream()
.filter(o -> !o.isWild())
.map(o -> o.getKeeper())
.filter(k -> k.isFemale())
.into(new ArrayList<>())
.size());
내 질문은 세트 내부 반복 중에 수달 중 하나가 무효가 되면 어떻게 되는 거야?
Null Pointer가 필요합니다.예외는 던져집니다만, 지금까지의 개발 패러다임(비기능적)에 얽매여 있는 것은 아닐까.누군가 어떻게 대처해야 하는지 가르쳐 주실 수 있을까요?
이것이 정말로 Null Pointer를 발생시키는 경우예외적으로 이 기능은 매우 위험하므로 다음과 같이만 사용해야 합니다.
- null 값이 없음을 확인하는 개발자(이전 .filter(o -> o!= null) 사용)
- 응용 프로그램이 처리할 Null Otter 또는 특별한 Null Otter 개체를 생성하지 않음을 확인하는 개발자.
가장 좋은 옵션 또는 다른 옵션은 무엇입니까?
100% 정답이지만 개선해야 할 작은 제안null
옵션에서 목록 자체의 케이스 처리:
List<String> listOfStuffFiltered = Optional.ofNullable(listOfStuff)
.orElseGet(Collections::emptyList)
.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
그 부분Optional.ofNullable(listOfStuff).orElseGet(Collections::emptyList)
고객님께서 사건을 잘 처리하실 수 있도록 도와드리겠습니다.listOfStuff
null 이며, Null Pointer 에 실패하는 대신 empty List 를 반환합니다.예외.
스튜어트의 답변은 훌륭한 설명을 제공하지만, 다른 예를 들어 보겠습니다.
이 문제는 다음 작업을 수행하려고 할 때 발생하였습니다.reduce
null 값을 포함하는 스트림(실제로는LongStream.average()
(이것은 일종의 삭감입니다).average()가 반환되므로OptionalDouble
스트림에 null이 포함될 수 있지만 대신 null Pointer가 포함될 수 있습니다.예외가 발생했습니다.이것은 null v. empty에 대한 Stuart의 설명 때문입니다.
OP에서 제안하는 바와 같이 다음과 같은 필터를 추가했습니다.
list.stream()
.filter(o -> o != null)
.reduce(..);
또는 아래 tangens에서 지적한 바와 같이 Java API에서 제공하는 술어를 사용합니다.
list.stream()
.filter(Objects::nonNull)
.reduce(..);
메일링 리스트에서 Stuart 링크: Streams의 null에 대한 Brian Goetz
현재의 사고방식은 Null을 "고통스럽게" 하는 것으로 보인다. 즉, 일부 작전은 덜 관대하고 결국 NPE를 던질 수도 있다.Lambda Libraries 익스퍼트 그룹 메일링 리스트의 null에 대한 설명, 특히 이 메시지를 참조하십시오.이후 옵션 #3에 대한 합의가 이루어졌습니다(Doug Lea의 눈에 띄는 반대 의견).그렇다. NPE와 함께 폭발하는 파이프라인에 대한 OP의 우려는 타당하다.
토니 호어가 무효를 "억 달러 실수"라고 언급한 것은 헛된 일이 아니다.쓸모없는 것들을 다루는 것은 정말 고통스럽다.클래식 컬렉션(람다나 스트림을 고려하지 않음)에서도 늘은 문제가 있습니다.코멘트에서 설명한 것처럼 null을 허용하는 컬렉션과 null을 허용하지 않는 컬렉션도 있습니다.null을 허용하는 컬렉션에서는 API에 모호성이 생깁니다.예를 들어 Map.get()의 경우 null 반환은 키가 존재하며 값이 null임을 나타내거나 키가 존재하지 않음을 나타냅니다.이 사건들을 명확히 하기 위해서는 추가 작업을 해야 한다.
null의 일반적인 용도는 값이 없음을 나타내는 것입니다.Java SE 8에서 제안된 이 문제에 대처하기 위한 접근방식은 새로운 유형을 도입하는 것입니다.새로운 유형은 값의 유무를 캡슐화하고 값이 존재하지 않을 경우 기본값을 지정하거나 예외를 발생시키거나 함수를 호출하는 등의 동작을 합니다. Optional
새로운 API에서만 사용되지만 시스템의 다른 모든 것은 여전히 null의 가능성을 견뎌야 합니다.
나의 조언은 가능한 한 실제 null 참조를 피하라는 것이다.어떻게 "무" 수달이 있을 수 있는지 예시를 보면 알 수 없다.그러나 필요한 경우 null 값을 필터링하거나 sentinel 객체(null Object Pattern)에 매핑하는 OP의 제안은 훌륭한 접근법입니다.
스트림에서 늘 값을 필터링하는 경우 java.util에 대한 메서드 참조를 사용하면 됩니다.Objects.non Null(개체).매뉴얼에서 다음 내용을 참조해 주세요.
이 메서드는 술어로 사용하기 위해 존재합니다.
filter(Objects::nonNull)
예를 들어 다음과 같습니다.
List<String> list = Arrays.asList( null, "Foo", null, "Bar", null, null);
list.stream()
.filter( Objects::nonNull ) // <-- Filter out null values
.forEach( System.out::println );
인쇄:
Foo
Bar
null을 회피하는 예(groupingBy 전에 필터 사용 등)
groupingBy 전에 null 인스턴스를 필터링합니다.
Here is an exampleMyObjectlist.stream()
.filter(p -> p.getSomeInstance() != null)
.collect(Collectors.groupingBy(MyObject::getSomeInstance));
2회 반복하지 않는 경우(필터 + 맵 또는 임의의 경우).이거 먹어봐.
private static void trimAll() {
String[] emtLne = {"", " ", " cc ", null, " xx "};
System.out.println(Arrays.stream(emtLne).map(val -> (val != null) ? val.trim() : "").collect(Collectors.joining()));
}
ccxx
언급URL : https://stackoverflow.com/questions/17081063/how-should-we-manage-jdk8-stream-for-null-values
'programing' 카테고리의 다른 글
Python의 stdlib를 사용하여 로컬 IP 주소 찾기 (0) | 2023.02.04 |
---|---|
봄의 @Valid 주석은 무엇을 의미합니까? (0) | 2023.02.04 |
Linux에서 문자열 리터럴의 메모리 주소가 다른 것과 다른 이유는 무엇입니까? (0) | 2023.01.25 |
Spark 경유로 Mariadb에 Apache Superset 연결 (0) | 2023.01.25 |
웅변적인 ORM 레벨 5 ID 배열 가져오기 (0) | 2023.01.25 |