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