详解Java8的forEach(...)如何提供index值

 更新时间:2021年03月17日 10:27:54   作者:Henry.Yao  
这篇文章主要介绍了详解Java8的forEach(...)如何提供index值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Java2遍历集合

遍历Collection的代码,可以是采用Iterator接口,通过next()遍历。如:

  List<String> list = Arrays.asList("Hi", "I", "am", "Henry.Yao");
  // 此处已经用到了泛型,不能算是纯粹的Java2代码,仅作Iterator示范
  for (Iterator<String> it = list.iterator(); it.hasNext();) {
    String item = it.next();
    System.out.println("listItem = " + item);
  }

输出:

listItem = Hi
listItem = I
listItem = am
listItem = Henry.Yao

Java5遍历集合

在Java5中,提供了增强的for循环,如:

  List<String> list = Arrays.asList("Hi", "I", "am", "Henry.Yao");
  for(String item : list) {
    System.out.println("listItem = " + item);
  }

Java8遍历集合

在Java8中,通过Lambda表达式提供了更简洁的编程方式,如:

  list.forEach(item -> {
    System.out.println("listItem = " + item);
  });

需同时提供index,咋办?

操作集合元素item的同时,如果还需要同时提供index值,咋办?
思考后,我们可能大都写出了如下的代码,同时心有不甘:

  List<String> list = Arrays.asList("Hi", "I", "am", "Henry.Yao");
  for(int index; index<list.size(); index++) { 
    String item = list.get(i);
    System.out.println("list["+index+"] = "+item);
  }

输出:

list[0] = Hi,
list[1] = I
list[2] = am
list[3] = Henry.Yao

期望的遍历模式

因为,如下的模式才是我们期望的模式

  list.forEach((item, index) -> {
    System.out.println("listItem = " + item);
  }); // Compile ERROR

这只是期望。实际上,Jdk8并没有提供该函数,直至Jdk11也均没有提供该函数。

通过BiConsumer包装Consumer实现

“没有工具,我们制造工具” 定义如下的工具方法,基于这个工具方法,我们就能在遍历集合,同时提供item和index值:

  // 工具方法
  public static <T> Consumer<T> consumerWithIndex(BiConsumer<T, Integer> consumer) {
    class Obj {
      int i;
    }
    Obj obj = new Obj();
    return t -> {
      int index = obj.i++;
      consumer.accept(t, index);
    };
  }

这样的业务代码,是我期望的!

基于该工具方法,便可轻松编写如下业务代码,清晰、简洁:

  list.forEach(LambdaUtils.consumerWithIndex((item, index) -> {
    System.out.println("list[" + index + "]=" + item);
  }));

思考过程

这个工具方法的设计过程,也是参考借鉴了distinctByKey,如图:

  // 工具方法
 public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
 Map<Object, Boolean> seen = new ConcurrentHashMap<>();
 return t -> Objects.isNull(seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE));
 }
  // 业务代码
  // 从人员列表中过滤出一个子集(每个部门选一个人)
  employees.stream().filter(distinctByKey(Employee::getDeptCode)).collect(toList());

我们不仅要会使用工具,更要会制造工具…

我们的程序,不仅仅只是大片的业务代码,更是需要抽象和提取出的诸多工具方法。
使用工具(使用Java和第三方提供的方法)到极致,那是高级程序员,
制造工具(分析和设计出项目的工具方法)到极致,那是高级设计师。

到此这篇关于详解Java8的forEach(...)如何提供index值的文章就介绍到这了,更多相关Java8 forEach提供index值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JAVA 中实现整句汉字拆分、转换为ASCII实例详解

    JAVA 中实现整句汉字拆分、转换为ASCII实例详解

    这篇文章主要介绍了JAVA 中实现整句汉字拆分、转换为ASCII实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • springboot mybatis里localdatetime序列化问题的解决

    springboot mybatis里localdatetime序列化问题的解决

    这篇文章主要介绍了springboot mybatis里localdatetime序列化问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Java中的ReentrantLock解读

    Java中的ReentrantLock解读

    这篇文章主要介绍了Java中的ReentrantLock解读,ReentantLock是java中重入锁的实现,一次只能有一个线程来持有锁,包含三个内部类,Sync、NonFairSync、FairSync,需要的朋友可以参考下
    2023-09-09
  • Java实现对象按照其属性排序的两种方法示例

    Java实现对象按照其属性排序的两种方法示例

    这篇文章主要介绍了Java实现对象按照其属性排序的两种方法,结合实例形式详细分析了Java对象按照其属性排序的两种实现方法与相关注意事项,需要的朋友可以参考下
    2020-05-05
  • 基于Java的Scoket编程

    基于Java的Scoket编程

    本文详细讲解了基于Java的Scoket编程,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • java动态目录树的实现示例

    java动态目录树的实现示例

    在开发过程中,常常需要对目录结构进行操作和展示,本文主要介绍了java动态目录树的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 使用IDEA打jar包的详细图文教程

    使用IDEA打jar包的详细图文教程

    JAR文件是一种压缩文件,与常见的ZIP压缩文件兼容,被称为JAR包,下面这篇文章主要给大家介绍了关于使用IDEA打jar包的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Spring Boot 集成Shiro的多realm配置过程

    Spring Boot 集成Shiro的多realm配置过程

    这篇文章主要介绍了Spring Boot 集成Shiro的多realm配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 在Spring中编写事务的介绍

    在Spring中编写事务的介绍

    今天小编就为大家分享一篇关于在Spring中编写事务的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • eclipse maven maven-archetype-webapp 创建失败问题解决

    eclipse maven maven-archetype-webapp 创建失败问题解决

    这篇文章主要介绍了eclipse maven maven-archetype-webapp 创建失败问题解决的相关资料,需要的朋友可以参考下
    2016-12-12

最新评论