java分页对象_如何在Java 8中对对象列表进行分页?

您可以将IntStream.iterate与toMap收集器和List上的subList方法结合使用(感谢Duncan的简化).

import static java.util.stream.Collectors.toMap;

import static java.lang.Math.min;

...

static Map> partition(List list, int pageSize) {

return IntStream.iterate(0, i -> i + pageSize)

.limit((list.size() + pageSize - 1) / pageSize)

.boxed()

.collect(toMap(i -> i / pageSize,

i -> list.subList(i, min(i + pageSize, list.size()))));

}

首先计算地图中所需的键数.这是由(list.size()pageSize – 1)/ pageSize给出的(这将是流的限制).

然后创建一个Stream,创建序列0,pageSize,2 * pageSize,….

现在对于每个值,你获取相应的subList,它将是我们的值(你需要额外检查最后一个subList,以便不越界),你为它映射相应的键,它将是序列0 / pageSize,pageSize / pageSize,2 * pageSize / pageSize除以pageSize得到自然序列0,1,2,….

管道可以安全地并行运行(您可能需要使用toConcurrentMap收集器).正如Brian Goetz评论的那样(感谢提醒我),如果你想并行化流,迭代是不值得的,所以这里是一个带范围的版本.

return IntStream.range(0, (list.size() + pageSize - 1) / pageSize)

.boxed()

.collect(toMap(i -> i ,

i -> list.subList(i * pageSize, min(pageSize * (i + 1), list.size()))));

因此,对于您的示例(页面大小为3的10个元素的列表),您将获得以下序列:

0,3,6,9,12,15,…你限制为(10 3 – 1)/ 3 = 12/3 = 4,它让序列为0,3,6,9.现在每个值都是映射到其对应的子列表:

0 / pageSize = 0 -> list.subList(0, min(0 + pageSize, 10)) = list.subList(0, 3);

3 / pageSize = 1 -> list.subList(3, min(3 + pageSize, 10)) = list.subList(3, 6);

6 / pageSize = 2 -> list.subList(6, min(6 + pageSize, 10)) = list.subList(6, 9);

9 / pageSize = 3 -> list.subList(9, min(9 + pageSize, 10)) = list.subList(6, 10);

^

|

this is the edge-case for the last sublist to

not be out of bounds

如果你真的想要一个Map< Integer,String>你可以用值替换值映射器函数

import static java.util.stream.Collectors.joining;

...

i -> list.subList(i, min(i + pageSize, list.size()))

.stream()

.map(Object::toString)

.collect(joining(","))

它只是将用逗号分隔的元素收集到一个String中.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值