[ジャワ]で図強制ストリームは、前記スキップ()および制限()メソッドと組み合わせ

1はじめに

この記事では、Java 8ストリームに2つの方法を説明します:skip()limit()これら2つの方法がありStream、それぞれ使用周波数で、また組み合わせて発生することができ、及び小さなフィーチャ、等を達成することができるだけでなく、非常に一般的subList等タブ。

2スキップ()メソッド

、名前知られている意味を参照してくださいskip()示すように、スキップ先にn個の要素のための方法を、そして、新しいストリームを返します。

コードを見てください:

List<Integer> result = Stream.of(1, 2, 3, 4, 5, 6)
  .skip(4)
  .collect(Collectors.toList());
List<Integer> expected = asList(5, 6);
assertEquals(expected, result);

方法skip()パラメータN 4例:

(1)場合にはn<0、時間、スローIllegalArgumentException例外。

(2)場合n=0の時間が、そのまま、むしろ任意の要素をスキップすることなく、それらの完全性を取得します。

(3)0<n<length時間は、リターン流素子の残りの部分を含む、n個の要素をスキップします。

(4)n>=length時間、すべての要素をスキップし、流れが空返します。

3限界()メソッド

以下のためにlimit()示されるように、すなわち、最初のn個の要素を取って、流れを制限するための要素の数である方法、、、新しいストリームを返します。

コードは以下の通りであります:

List<Integer> result = Stream.of(1, 2, 3, 4, 5, 6)
  .limit(4)
  .collect(Collectors.toList());
List<Integer> expected = asList(1, 2, 3, 4);
assertEquals(expected, result);

方法limit()パラメータN 4例:

(1)場合にはn<0、時間、スローIllegalArgumentException例外。

(2)n=0空の戻り流れ有する要素がありません、。

(3)0<n<length最初のn個の要素を取り出し、新しいフローを返します。

(4)ときn>=lengthの時間は、そのまますべての要素を、取って、彼らの完全なプロパティを取得します。

操作無制限のストリームの4つのペア

私たちが使用している有限と無限のストリームの流量制限前の例にストリームの流れ、およびJavaコレクションクラス、ストリーミングは無制限であることができます。無限のストリームのために、skip()そしてlimit()最初のコードに大きな違いを示しました。

Stream.iterate(1, i -> i + 1)
  .filter(num -> (num & (num - 1)) == 0)
  .limit(10)
  .forEach(System.out::println);
System.out.println("----------------");
Stream.iterate(1, i -> i + 1)
  .filter(num -> (num & (num - 1)) == 0)
  .skip(10)
  .forEach(System.out::println);

执行后发现,limit()是可以将无限流转化为有限流的,所以我们也可以认为它是一个短路操作。而skip()则不行,不管你跳过了前面多少个元素,总还是会有源源不断的元素过来,无法收敛。

上述代码的结果是:

通过limit()输出了前十个2的n次方值:
1, 2, 4, 8, 16, 32, 64, 128, 256, 512

skip()跳过了前10个,继续输出,但会不断执行下去(会有int的溢出现象):

1024, 2048, 4096, 8192, 16384, 32768...

5 组合应用

除了两者各自有各自的功能外,我们通过组合使用,可以实现其它功能。

5.1 与subList的替换

集合类如List是有subList()这个方法的,可以截取List中的某一部分,这个功能还可以通过组合skip()limit()使用得到,如下面代码:

List<Integer> list = asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
List<Integer> expected = list.subList(3, 7);

List<Integer> result = list.stream()
  .skip(3)
  .limit(7 - 3)
  .collect(Collectors.toList());
assertEquals(expected, result);

subList(startIndex, endIndex)转换成skip(startIndex).limit(endIndex - startIndex)

5.2 分页

可以通过组合使用skip()limit()进行分页,如下面代码:

int pageSize = 10;
int pageIndex = 7;

List<Integer> expected = asList(61, 62, 63, 64, 65, 66, 67, 68, 69, 70);
List<Integer> result = Stream.iterate(1, i -> i + 1)
  .skip((pageIndex - 1) * pageSize)
  .limit(pageSize)
  .collect(Collectors.toList());

assertEquals(expected, result);

上面代码例子是获取了第七页数据,每页大小为10。

6 总结

本文介绍了Java 8的Stream接口中两个常用的方法:skip()limit(),比较简单易懂,也介绍了怎么组合使用。需要注意的是,如果Stream过大或是无限流,小心skip()会有性能问题。


欢迎关注公众号<南瓜慢说>,将持续为你更新...

欢迎加博主微信,做一个点赞之友,哈哈...

多读书,多分享;多写作,多整理。

おすすめ

転載: www.cnblogs.com/larrydpk/p/12078124.html