Java8中用foreach循环获取对象的index下标详解

 更新时间:2021年04月17日 14:20:20   作者:RhapsodyDandelion  
这篇文章主要给大家介绍了关于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

PS:这个Set也可以用哦,不过在Set使用中这个index可不是下标

总结

到此这篇关于Java8中用foreach循环获取对象的index下标的文章就介绍到这了,更多相关Java8获取对象index下标内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Spring MVC优雅处理异常的6种方式

    详解Spring MVC优雅处理异常的6种方式

    在Spring中提供了多种机制来处理控制器抛出的异常,确保应用程序在面对各种错误情况时能够优雅地响应,本文我们来详细分析Spring MVC中6种优雅处理异常的方式,需要的可以参考下
    2024-12-12
  • java 深拷贝与浅拷贝机制详解

    java 深拷贝与浅拷贝机制详解

    这篇文章主要介绍了 java 深拷贝与浅拷贝机制详解的相关资料,需要的朋友可以参考下
    2017-02-02
  • 关于mybatisPlus yml配置方式

    关于mybatisPlus yml配置方式

    这篇文章主要介绍了mybatisPlus yml配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java编写简易rabbitmq生产者与消费者的代码

    Java编写简易rabbitmq生产者与消费者的代码

    开发时经常与其它系统用rabbitmq对接,当需要自测时,还是自己写rabbitmq生产者、消费者自测方便些,下面给大家总结使用java编写简易rabbitmq的方法,感兴趣的朋友一起看看吧
    2023-11-11
  • SpringBoot发送各种复杂格式邮件的示例详解

    SpringBoot发送各种复杂格式邮件的示例详解

    本文主要介绍了如何使用JavaMailSender接口和MimeMessageHelper类,在SpringBoot实现发送带有附件,嵌入资源,抄送和密送的复杂邮件,需要的可以了解下
    2024-11-11
  • HashSet和TreeSet使用方法的区别解析

    HashSet和TreeSet使用方法的区别解析

    这篇文章主要介绍了HashSet和TreeSet使用方法的区别解析,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Spring向页面传值和接受页面传过来的参数详解

    Spring向页面传值和接受页面传过来的参数详解

    这篇文章主要给大家介绍了关于Spring向页面传值和接受页面传过来的参数的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • Java内存模型详解

    Java内存模型详解

    JMM全称Java Memory Model, 中文翻译Java内存模型,一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,本详细介绍了Java内存模型,感兴趣的同学可以参考一下
    2023-04-04
  • java中double类型运算结果异常的解决方法

    java中double类型运算结果异常的解决方法

    下面小编就为大家带来一篇java中double类型运算结果异常的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • 解决springboot启动报错bean找不到的问题

    解决springboot启动报错bean找不到的问题

    这篇文章主要介绍了解决springboot启动报错bean找不到原因,本文给大家分享完美解决方案,通过图文相结合给大家介绍的非常详细,需要的朋友可以参考下
    2023-03-03

最新评论