怎么使用Java中的foreach语句来获取对象index下标
这篇文章主要介绍了怎么使用Java中的foreach语句来获取对象index下标,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
前言在Java8中,我们经常使用lambada表达式进行foreach循环,但是常常我们在遍历List的时候想获取对象的index,但是Java8、9、10、11都没有相关的支持,同样的问题也存在于增强型for循环中,很多时候不得不含着泪以 for (int i = 0; i < list.size(); i++) 的方式写代码
我们的期望list.foreach((item,index)->{})//编译不通过
常见的list获取index方法
for(int i=0;i<list.size();i++>)
for(inti=0;i<list.size();i++){}
indexOf(Obj)
for(Objecto:list){list.indexOf(o);//如果是Set还没有这个方法}
还有…
inti=0;for(Strings:list){i++;}
很显然上述的方法并不是我们所想要的
Consumer和BiConsumer我们看个简单的例子
Consumer<String>consumer=t->System.out.println(t);consumer.accept("single");BiConsumer<String,String>biConsumer=(k,v)->System.out.println(k+":"+v);biConsumer.accept("multipart","doubleparams");
输出结果:
single
multipart:double params
这里不难发现我们平时写的箭头函数其实是一个Consumer或者BiConsumer对象
定制Consumerforeach源码
defaultvoidforEach(Consumer<?superT>action){Objects.requireNonNull(action);for(Tt:this){action.accept(t);}}
分析源码可知,我们的list foreach方法传入的是Consumer对象,支持一个参数,而我们想要的是item,index两个参数,很明显不满足,这时我们可以自定义一个Consumer,传参是BiConsumer,这样就能满足我们需求了,代码如下:
importjava.util.ArrayList;importjava.util.List;importjava.util.function.BiConsumer;importjava.util.function.Consumer;publicclassLambadaTools{/***利用BiConsumer实现foreach循环支持index**@parambiConsumer*@param<T>*@return*/publicstatic<T>Consumer<T>forEachWithIndex(BiConsumer<T,Integer>biConsumer){/*这里说明一下,我们每次传入forEach都是一个重新实例化的Consumer对象,在lambada表达式中我们无法对int进行++操作,我们模拟AtomicInteger对象,写个getAndIncrement方法,不能直接使用AtomicInteger哦*/classIncrementInt{inti=0;publicintgetAndIncrement(){returni++;}}IncrementIntincrementInt=newIncrementInt();returnt->biConsumer.accept(t,incrementInt.getAndIncrement());}}
调用示例:
List<String>list=newArrayList();list.add("111");list.add("222");list.add("333");list.forEach(LambadaTools.forEachWithIndex((item,index)->{System.out.println(index+":"+item);}));
输出结果如下:
0:111
1:222
2:333
PS:这个Set也可以用哦,不过在Set使用中这个index可不是下标
感谢你能够认真阅读完这篇文章,希望小编分享的“怎么使用Java中的foreach语句来获取对象index下标”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。