IntStream を逆順ソートしようとしたときのメモ

IntStream を逆順ソートしようとしたときのメモ。

IntStream の sorted() メソッドは Comparator インタフェースを受けない

IntStream の sorted() メソッドは Comparator インタフェースを受けないので以下のようなコードは書けない。

IntStream reverse = IntStream.rangeClosed(1, 3)
    .sorted(Comparator.reverseOrder()); // コンパイルエラー

解決策

IntStream を Stream<Integer> に変換する

IntStream を Stream<Integer> にすれば sorted() メソッドが Comparator インタフェースを受けるので以下のように書ける。

IntStream reverse = IntStream.rangeClosed(1, 3)
    .boxed()
    .sorted(Comparator.reverseOrder())
    .mapToInt(Integer::new);
IntStream のまま逆順ソートする

IntStream はプリミティブの int に特化した Stream なので Stream<Integer> に変換するほどでもない…というときは以下のようにも書ける。

IntStream reverse = IntStream.rangeClosed(1, 3)
          .map(i -> 3 - i + 1);

実際のところこんな感じのユーティリティメソッドを作っておけば十分な気がする。

private IntStream reverseRangeClosed(int startInclusive, int endInclusive) {
    return IntStream.rangeClosed(startInclusive, endInclusive)
            .map(i -> endInclusive - i + startInclusive);
}

// 使う
reverseRangeClosed(1, 3)
        .forEach(System.out::println);
// 3
// 2
// 1