9

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

リストをシャッフルした可能性があるため、追加の並べ替えを使用します。

4

2 に答える 2

27

忘れないでくださいCollection.removeIf。最小値と最大値を計算してから、次を実行できます。

list.removeIf(x -> x == min || x == max);

(これは重複にもうまく対処します。)

于 2014-07-10T15:54:11.037 に答える