次の現場でJava8を使うためStreamAPIを予習していく。
今回は結構使う機会の多いソートについて基本から解説していく。
単純にListをソートする
単純にソートする場合は以下のように記述します。
①でソートするListを作成
②のnumbers.stream()でStream<Integer>型のstreamを生成します。
このstreamさんが今回の主役です。こいつにいろいろ指示を出してソートしてもらい、結果を受け取ります。
③でstream.sorted()を呼び出しソートしたStream<Integer>を取得
デフォルトでは昇順に並べ替えるようです。ただ、引数にstream.sorted(Comparator.reverseOrder())を指定することで降順にソートすることも可能です。
④でソート後のstreamから要素を収集します。
Stream.collect()はJava Stream APIの一部で、ストリームの要素を収集し、リストやマップなどのコレクションに変換するための終端操作です
ストリームの要素を最終的な結果に変換するために使います。
今回はList型に変換したいのでCollectors.toList()を引数に入れています。
他にもMapや連結した文字列などにも変換できるので応用の幅がありそう。
⑤は単純に表示しているだけです。
⑥はチェーンでまとめて書くパターン。より簡潔に記載できます。
実際の現場で使う場合はこちらの書き方を使います。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
//①Listの準備
List<Integer> numbers = Arrays.asList(1, 4, 5, 7, 3, 6, 2, 9);
//②Listからstream作成
Stream<Integer> stream = numbers.stream();
//③ソート
//降順の場合はstream.sorted(Comparator.reverseOrder());
Stream<Integer> sortedStream = stream.sorted();
//④ストリームをListに収集
List<Integer> sortedNumbers = sortedStream.collect(Collectors.toList());
//⑤表示
sortedNumbers.forEach(System.out::println);
//⑥チェーンでまとめて書くことの方が多い
List<Integer> sortNums = Arrays.asList(2, 4, 3, 1, 7, 5, 7, 9);
List<Integer> sortedNums = sortNums.stream()
.sorted()
.collect(Collectors.toList());
sortedNums.forEach(System.out::println);
}
}
以上です。
次回は様々な条件を加えてソートするサンプルプログラムも作りたい。
コメント