<menu id="ycqsw"></menu><nav id="ycqsw"><code id="ycqsw"></code></nav>
<dd id="ycqsw"><menu id="ycqsw"></menu></dd>
  • <nav id="ycqsw"></nav>
    <menu id="ycqsw"><strong id="ycqsw"></strong></menu>
    <xmp id="ycqsw"><nav id="ycqsw"></nav>
  • javaindexof函數的用法(java中的substring方法)


    在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”,回復獲取免費下載原文件的方式。

    版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

    發表評論

    登錄后才能評論
    国产精品区一区二区免费