2017-10-04 9 views
2

と整数のソートリストはあなたが最大値を取得したい場合、あなたはのJava 8 - ヌル

OptionalInt max = integers.stream() 
     .mapToInt(Integer::valueOf) 
     .max(); 

これを試すことができます今はnull vaues

List<Integer> integers = Arrays.asList(null, 9, 11, 7, 5, null); 

を含む整数のリストを持っているとしましょうリストにnullが含まれていない場合は機能します。私たちの場合、NullPointerExceptionが存在します。いくつかの研究の後、私はあなたが非ヌルその後、ヌルがあまり考慮すれば、それは動作します

Optional<Integer> max = integers.stream() 
     .max(Comparator.nullsFirst(Comparator.naturalOrder())); 

このようなソリューションを見ることができます。あなたは彼らが大きくなるとnullsLast

Optional<Integer> max = integers.stream() 
     .max(Comparator.nullsLast(Comparator.naturalOrder())); 

をnullsFirstを変更したい場合はしかし、その後、あなたは再びNullPointerExceptionが会う予定です。

私は面白いです - なぜnullsLastは、この場合、ヌルフレンドリーであると書かれていることを考慮して動作しませんか? nullを含む整数のリストをソートする最善の方法は何ですか?

あなたのアイデアをお寄せいただきありがとうございます。

答えて

2

Stream#max状態のドキュメント:

が例外:NullPointerException - 最大の要素は、あなたが最大の要素としてnullを検討するコンパレータを提供されるように、なぜ、そのがある

nullの場合それは例外をスローします。

これはstateはあなたの例ではnullことでOptional.of(state);を返そうとしたときにスタックトレースを示し、渡された値がnullであればOptional.ofがNPEをスローするものです。

Comparator.nullsLastは、たとえば、正常に動作します:

Integer max = 
    Collections.max(integers, Comparator.nullsLast(Comparator.naturalOrder())); 

は確かにあなたにnullを与えるだろう。

0

についてComparatorそれ自体はありません。

List<Integer> result = integers.stream() 
      .sorted(Comparator.nullsLast(Comparator.naturalOrder())) 
      .collect(Collectors.toList()); 
System.out.println(result); // [5, 7, 9, 11, null, null] 

あなたが最後にあなたのヌルを入れているし、それがmaxだろう。 nullにあるmaxを呼び出すと、それはNullPointerExceptionをスローします。

2

あなたはnullが最大となり、任意の非null値よりも大きくなるように考慮すれば、当然のことながら、nullたときに、リストがどのnullが含まれています。

結果がnullの場合、はNullPointerExceptionを投げていることが既に文書化されているため、これは予想される動作です。設計の理論的根拠はに似ており、これについてはthis Q&Aで説明しています。

Optional<Integer> max = integers.stream() 
    .max(Comparator.nullsFirst(Comparator.naturalOrder())); 

がまだ失敗する可能性が

ノート、すなわちすべての値がnullである場合。解決策は単純明快であるとしてではなく、ここでカスタムComparatorを使用してもポイントは、ありません。

OptionalInt max = integers.stream() 
    .filter(Objects::nonNull) 
    .mapToInt(Integer::valueOf) 
    .max(); 

あなたは空のOptionalIntを取得すると、あなたはまだすべての要素がnullた、あるいはまったくがあったかどうかを判断するためにintegers.isEmpty()をテストしますまったく要素。