为了账号安全,请及时绑定邮箱和手机立即绑定

java8 stream根据下标分组

java8 stream根据下标分组

守候你守候我 2019-05-25 14:47:34
我有个list想要按照奇偶下标生成两组list,只利用java8的stream可以做到吗?比如[1,3,5,7,9],按照奇偶下标分成[1,5,9]和[3,7],但是stream似乎无法获取下标,所以试了半天也不行。另外,java8的stream以后可以完全取代for循环吗?我感觉有些复杂的逻辑拿stream折腾不是一个好的选择
查看完整描述

2 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

这个要从为什么java8会弄出stream这种循环方式说起了
以前的for循环是属于外部循环,由调用者自己显式的取出每个元素加以处理,尤其是并行处理时,非常痛苦
而stream是属于内部循环,你可以无需关心它是如何循环的,要是并行的时候如何优化,这些你都可以不管,你只需要简简单单告诉他需要做什么处理即可
举个简单的例子:
地上有很多乒乓球,爸爸要让你儿子捡起来放到盒子里如果是外部循环,可能这种模式爸爸:地上还有球么儿子:有爸爸:那把它捡起来放到盒子里,还有么?儿子:有爸爸:继续捡起来放到盒子里,还有么?儿子:有爸爸:接着捡起来放到盒子里,还有么?儿子:没有了爸爸:ok,收拾好了
如果是内部循环爸爸:把地上的球捡起来全部放到盒子里儿子:好,完成
例子可能很牵强,但是我们作为开发者,就是爸爸,只需要告诉儿子(JDK)把球放进盒子这个动作就好,具体儿子怎么放,一次一个手拿一个,还是一次每个手拿一个,由它自己来思考,不需要我们去指挥,我们只关注具体需要做的事就好
所以说stream是一种内部循环,你不需要去关注下标...关注下标的话,从某种意义上来说,还是外部循环的思想在处理了,当然题主的问题中,明确就是要求是关注下标了,貌似好像stream是没法写似的
其实不然,写肯定能写的,只是说换一种方式而已,不把下标当成循环用的元素,而是把它与具体需要循环的数字绑定起来,写出来差不多是这个样子
publicstaticvoidmain(String[]args){
Listlist=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
ListevenList=collect.get(Boolean.TRUE);
//奇数列表1,5,7
ListoddList=collect.get(Boolean.FALSE);
}
privatestaticAbstractMap.SimpleEntrymapToEntry(Integeri,Integerinteger){
returnnewAbstractMap.SimpleEntry(i,integer);
}
                            
查看完整回答
反对 回复 2019-05-25
  • 2 回答
  • 0 关注
  • 3469 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号