温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在Java8中使用foreach循环获取对象的index下标

发布时间:2021-04-17 15:32:34 来源:亿速云 阅读:1404 作者:Leah 栏目:开发技术

这期内容当中小编将会给大家带来有关怎么在Java8中使用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 (int i = 0; i < list.size(); i++) {    }

indexOf(Obj)

for (Object o : list) {     list.indexOf(o); //如果是Set还没有这个方法 }

还有…

int i = 0; for (String s : 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","double params");

输出结果:

single
multipart:double params

这里不难发现我们平时写的箭头函数其实是一个Consumer或者BiConsumer对象

定制Consumer

foreach源码

default void forEach(Consumer<? super T> action) {     Objects.requireNonNull(action);     for (T t : this) {         action.accept(t);     } }

分析源码可知,我们的list foreach方法传入的是Consumer对象,支持一个参数,而我们想要的是item,index两个参数,很明显不满足,这时我们可以自定义一个Consumer,传参是BiConsumer,这样就能满足我们需求了,代码如下:

import java.util.ArrayList; import java.util.List; import java.util.function.BiConsumer; import java.util.function.Consumer; public class LambadaTools {     /**      * 利用BiConsumer实现foreach循环支持index      *      * @param biConsumer      * @param <T>      * @return      */     public static <T> Consumer<T> forEachWithIndex(BiConsumer<T, Integer> biConsumer) {         /*这里说明一下,我们每次传入forEach都是一个重新实例化的Consumer对象,在lambada表达式中我们无法对int进行++操作,         我们模拟AtomicInteger对象,写个getAndIncrement方法,不能直接使用AtomicInteger哦*/         class IncrementInt{             int i = 0;             public int getAndIncrement(){                 return i++;             }         }         IncrementInt incrementInt = new IncrementInt();         return t -> biConsumer.accept(t, incrementInt.getAndIncrement());     } }

调用示例:

List<String> list = new ArrayList(); 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

上述就是小编为大家分享的怎么在Java8中使用foreach循环获取对象的index下标了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI