Java 8 の新しいストリーミング API を使用するコード設計にはほとんど問題がありません。新しいことを学びたいのですが、タスクの 1 つは次のとおりです。
リストから最大値と最小値を拒否します。リストには重複が含まれていません。
シンプルに見えますか?いいえ...私のコード:
List<Integer> ranges = Lists.newArrayList(new Range(1, 15));
List<Integer> collect = ranges.stream()
.filter(x -> x != ranges.stream()
.mapToInt(Integer::intValue)
.max()
.getAsInt())
.filter(x -> x != ranges.stream()
.mapToInt(Integer::intValue)
.min()
.getAsInt())
.collect(Collectors.toList());
assertThat(collect).hasSize(13); // OK
assertThat(collect).isEqualTo(Lists.newArrayList(new Range(2,14))); // OK
このコードは優れています (最小/最大の重複がない場合のみですが、これはここでの重要な問題ではありません) が、問題はここで 3 つのストリームを使用していることです。1 つ目はメイン ストリーム、2 つ目は最大値を削除、3 つ目は最小値を削除します。このタスクを 1 つのストリームで実行する可能性はありますか?
//編集: 非常に原始的な Scala バージョン:
val list = List.range(1, 15).sortWith(_>_).tail.reverse.tail
リストをシャッフルした可能性があるため、追加の並べ替えを使用します。