java list下标_java8 stream根据下标分组

这个要从为什么java8会弄出stream这种循环方式说起了

以前的for循环是属于外部循环,由调用者自己显式的取出每个元素加以处理,尤其是并行处理时,非常痛苦

而stream是属于内部循环,你可以无需关心它是如何循环的,要是并行的时候如何优化,这些你都可以不管,你只需要简简单单告诉他需要做什么处理即可

举个简单的例子:

地上有很多乒乓球,爸爸要让你儿子捡起来放到盒子里

如果是外部循环,可能这种模式

爸爸:地上还有球么

儿子:有

爸爸:那把它捡起来放到盒子里,还有么?

儿子:有

爸爸:继续捡起来放到盒子里,还有么?

儿子:有

爸爸:接着捡起来放到盒子里,还有么?

儿子:没有了

爸爸:ok,收拾好了

如果是内部循环

爸爸:把地上的球捡起来全部放到盒子里

儿子:好,完成

例子可能很牵强,但是我们作为开发者,就是爸爸,只需要告诉儿子(JDK)把球放进盒子这个动作就好,具体儿子怎么放,一次一个手拿一个,还是一次每个手拿一个,由它自己来思考,不需要我们去指挥,我们只关注具体需要做的事就好

所以说stream是一种内部循环,你不需要去关注下标...关注下标的话,从某种意义上来说,还是外部循环的思想在处理了,当然题主的问题中,明确就是要求是关注下标了,貌似好像stream是没法写似的

其实不然,写肯定能写的,只是说换一种方式而已,不把下标当成循环用的元素,而是把它与具体需要循环的数字绑定起来,写出来差不多是这个样子

public static void main(String[] args) {

List list = Arrays.asList(1,3,5,7,9);

Map> collect = IntStream.rangeClosed(1, list.size())

.boxed()

// 把数字和下标绑定起来

.map(i -> mapToEntry(i, list.get(i-1)))

// 按照下标是否能被2整除进行分组

.collect(Collectors.partitioningBy(simpleEntry -> Integer.parseInt(simpleEntry.getKey().toString()) % 2 == 0,

Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

// 偶数列表 3,9

List evenList = collect.get(Boolean.TRUE);

// 奇数列表 1,5,7

List oddList = collect.get(Boolean.FALSE);

}

private static AbstractMap.SimpleEntry mapToEntry(Integer i, Integer integer) {

return new AbstractMap.SimpleEntry(i, integer);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值