欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

javaindexof函数的用法(java中的substring方法)

程序员文章站 2022-04-10 18:46:07
在java8中,我们经常使用lambada表达式进行foreach循环,但是常常我们在遍历list的时候想获取对象的index,但是java8、9、10、11都没有相关的支持,同样的问题也存在于增强型...

在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”,回复获取免费下载原文件的方式。