1. 序章
この短い記事では、 Java Stream APIのskip()メソッドと limit()メソッドについて説明し、それらの類似点と相違点を強調します。 。
これらの2つの操作は、最初は非常に似ているように見えますが、実際には非常に異なる動作をし、互換性はありません。 実際、これらは補完的であり、一緒に使用すると便利です。 それらについてもっと学ぶために読み続けてください。
2. skip()メソッド
skip(n)メソッドは、ストリームの最初のn個の要素を破棄する中間操作です。 n パラメーターを負にすることはできません。ストリームのサイズよりも大きい場合、 skip()は空のストリームを返します。
例を見てみましょう:
Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
.filter(i -> i % 2 == 0)
.skip(2)
.forEach(i -> System.out.print(i + " "));
このストリームでは、偶数のストリームを取得していますが、最初の2つはスキップします。 したがって、結果は次のようになります。
6 8 10
このストリームが実行されると、forEachはアイテムの要求を開始します。 skip()に到達すると、この操作は最初の2つのアイテムを破棄する必要があることを認識しているため、結果のストリームにそれらを追加しません。 その後、残りのアイテムを含むストリームを作成して返します。
これを行うために、 skip()操作は、各瞬間に見られる要素の状態を維持する必要があります。 このため、 skip()はステートフル操作であると言えます。
3. limit()メソッド
limit(n)メソッドは、要求されたサイズより長くないストリームを返す別の中間操作です。 以前と同様に、nパラメーターを負にすることはできません。
例でそれを使用してみましょう:
Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
.filter(i -> i % 2 == 0)
.limit(2)
.forEach(i -> System.out.print(i + " "));
この場合、intのストリームから2つの偶数を取得しています。
2 4
skip()操作の場合と同様に、 limit()も、ピックアップされているアイテムの状態を保持する必要があるため、ステートフル操作です。
ただし、ストリーム全体を消費する skip()とは異なり、 limit()はアイテムの最大数に達するとすぐに、それ以上アイテムを消費せず、結果を返すだけです。ストリーム。 したがって、 limit()は短絡操作であると言えます。
無限ストリームを処理する場合、 limit()は、ストリームを有限ストリームに切り捨てるのに非常に役立ちます。
Stream.iterate(0, i -> i + 1)
.filter(i -> i % 2 == 0)
.limit(10)
.forEach(System.out::println);
この例では、無限の数のストリームを10個の偶数のみのストリームに切り捨てています。
4. skip()と limit()の組み合わせ
前述したように、skipとlimitの操作は補完的であり、これらを組み合わせると、場合によっては非常に役立つことがあります。
前の例を変更して、10個のバッチで偶数を取得するとします。 同じストリームでskip()と limit()の両方を使用するだけで、これを行うことができます。
private static List<Integer> getEvenNumbers(int offset, int limit) {
return Stream.iterate(0, i -> i + 1)
.filter(i -> i % 2 == 0)
.skip(offset)
.limit(limit)
.collect(Collectors.toList());
}
ご覧のとおり、この方法を使用すると、ストリームを非常に簡単にページングできます。 これは非常に単純なページネーションですが、ストリームをスライスするときにこれがどれほど強力であるかがわかります。
5. 結論
この簡単な記事では、Java StreamAPIのskip()メソッドと limit()メソッドの類似点と相違点を示しました。 また、これらのメソッドの使用方法を示すために、いくつかの簡単な例を実装しました。
いつものように、例の完全なソースコードは、GitHubでから入手できます。