网站首页 > 精选教程 正文
在Java8中,我们经常使用lambada表达式进行foreach循环,但是常常我们在遍历List的时候想获取对象的index,但是Java8、9、10、11都没有相关的支持,同样的问题也存在于增强型for循环中,很多时候不得不含着泪以 for (int i = 0; i < list.size(); i++) 的方式写代码
由于篇幅原因,小编已将Java系列知识都整理出来了,有需要的私信我关键词 “Java”,回复获取免费下载原文件的方式。
我们的期望
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可不是下标
看完这篇文章你学会了吗?
注意一下咯:由于篇幅原因,小编已将JAVA相关的知识都集结整理出来了,有需要的私信我关键词 “Java”,回复获取免费下载原文件的方式。
作者:RhapsodyDandelion
链接:https://juejin.cn/post/6951283538687688717
来源:掘金
猜你喜欢
- 2024-11-22 阿里巴巴Java性能调优实战:Stream如何提高遍历集合效率?
- 2024-11-22 java实现二叉树的Node节点定义手撕8种遍历(一遍过)
- 2024-11-22 JAVA开发常用到的Map遍历
- 2024-11-22 java使用ByteBuffer并进行多文件合并和拆分
- 2024-11-22 JNI:本地代码调用Java代码
- 2024-11-22 Mysql溯源-任意文件读取??
- 2024-11-22 Java--通过Properties类读取属性文件
- 2024-11-22 JAVA获取字符串内的括号对(支持多层级)
- 2024-11-22 Java遍历一个 List 有哪些方式?每种的实现原理以及哪种最高效?
- 2024-11-22 Java面试题之二叉树的三种遍历
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)