返回顶部
首页 > 资讯 > 后端开发 > Python >详解Java8的forEach(...)如何提供index值
  • 107
分享到

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

2024-04-02 19:04:59 107人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

Java2遍历集合 遍历Collection的代码,可以是采用Iterator接口,通过next()遍历。如: List<String> list = Arra

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值内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解Java8的forEach(...)如何提供index值

本文链接: https://lsjlt.com/news/121838.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解Java8的forEach(...)如何提供index值
    Java2遍历集合 遍历Collection的代码,可以是采用Iterator接口,通过next()遍历。如: List<String> list = Arra...
    99+
    2024-04-02
  • 怎么在Java8中给forEach()函数提供index值
    怎么在Java8中给forEach()函数提供index值?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java2遍历集合遍历Collection的代码,可以是...
    99+
    2023-06-14
  • Java8中用foreach循环获取对象的index下标详解
    前言 在Java8中,我们经常使用lambada表达式进行foreach循环,但是常常我们在遍历List的时候想获取对象的index,但是Java8、9、10、11都没有相关的支持,...
    99+
    2024-04-02
  • 如何为导入的嵌入结构文字提供值?
    问题内容 这里是菜鸟:) 我无法理解 当我在一个文件中执行此操作时: scratch.go package main import "fmt" type foo struct { ...
    99+
    2024-02-05
  • PHP 中提示undefined index如何解决
    一、相关信息 平时用$_post['']或$_get['']获取表单中参数时会出现Notice: Undefined index: --------; 以及我们经常接收表单POST过来的数据时报Undefined index错误 例如:$a...
    99+
    2023-09-16
    php 开发语言
  • 如何使用 golang 为 lambda 函数提供配置值
    “纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《如何使用 golang 为 lambda 函数提供配置值》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新...
    99+
    2024-04-05
  • Java如何提供给第三方使用接口方法详解
    目录前言接口Controller接口幂等性校验实现类ServiceImpl第三方调用接口Api实现类生成签名工具类HttpCilent工具类附:分享一个获取IP工具类总结前言 相信有...
    99+
    2024-04-02
  • 如何解决Mybatis #foreach中相同的变量名导致值覆盖的问题
    这篇文章主要讲解了“如何解决Mybatis #foreach中相同的变量名导致值覆盖的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决Mybatis #foreach中相同的变量名...
    99+
    2023-06-20
  • Spring Cloud实现提供API给客户端的方法详解
    前言现在越来越多的公司开始拥抱Spring Cloud了,Spring Boot做为下一代 web 框架,Spring Cloud 作为最新最火的微服务的翘楚,你还有什么理由拒绝。很多Java方向的同学也开始积极的学习Spring Clou...
    99+
    2023-05-30
  • 我们如何在 MySQL 中提供只有年(零个月和零天)值的日期?
    通过禁用 NO_ZERO_IN_DATE 模式,我们可以在 MySQL 表中存储仅包含年份值、零月份和零日的日期。如果启用此模式,MySQL 会将此类日期视为无效日期并存储全零。mysql> Insert into year_test...
    99+
    2023-10-22
  • 如何解决Mybatis中foreach嵌套使用if标签对象取值的问题
    今天小编给大家分享一下如何解决Mybatis中foreach嵌套使用if标签对象取值的问题的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来...
    99+
    2023-06-29
  • 如何解决z-index为负值的元素无法点击到的问题
    这篇文章将为大家详细讲解有关如何解决z-index为负值的元素无法点击到的问题,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。最近做背投广告,因为默认页面没有设置z-index,发现如果将z-...
    99+
    2023-06-08
  • 如何理解.asmx处理程序提供的XML映射功能
    本篇文章为大家展示了如何理解.asmx处理程序提供的XML映射功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。将 XML映射到对象在 WebMehod 处理程序确定了要调用的方法之后,它需要将 X...
    99+
    2023-06-18
  • 详解Java8如何使用Lambda表达式进行比较
    目录支持Lambda的基本排序无类型定义的基本排序使用引用静态方法进行排序Sort Extracted Comparators反向排序使用多个条件进行排序使用多个条件排序-组合使用S...
    99+
    2024-04-02
  • 如何理解AWS所提供的针对Docker的EC2容器服务
    这篇文章主要介绍“如何理解AWS所提供的针对Docker的EC2容器服务”,在日常操作中,相信很多人在如何理解AWS所提供的针对Docker的EC2容器服务问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理...
    99+
    2023-06-10
  • php foreach循环中如何获取当前元素的索引值
    今天小编给大家分享一下php foreach循环中如何获取当前元素的索引值的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、...
    99+
    2023-07-05
  • Android如何创建自己的内容提供器
    小编给大家分享一下Android如何创建自己的内容提供器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!创建内容提供器的步骤前面已经提到过,如果想要实现跨程序共享数...
    99+
    2023-05-30
    android
  • 美国云主机的提供商如何选择
    选择美国云主机提供商时,可以考虑以下几点: 信誉和口碑:选择有良好信誉和口碑的云主机提供商,可以确保服务质量和客户满意度。 ...
    99+
    2024-04-18
    美国云主机 云主机
  • python如何提取字典的值
    要提取字典的值,可以使用字典的`values()`方法。以下是一个示例代码:```python# 定义一个字典my_dict = {...
    99+
    2023-09-20
    python
  • 如何提供服务器访问网站的速度?
    如何提供服务器访问网站的速度?随着互联网的普及和发展,用户对于网站的访问速度要求越来越高。慢速的网站导致用户体验下降,可能会使您失去潜在的客户。因此,通过优化服务器的访问速度,您可以提高网站的可用性和整体性能,从而增加网站的吸引力和竞争力...
    99+
    2024-01-23
    服务器 服务器访问速度 网站服务器 云服务器知识
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作