您好,登錄后才能下訂單哦!
這篇文章主要介紹了怎么使用Java中的foreach語(yǔ)句來(lái)獲取對(duì)象index下標(biāo),具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
在Java8中,我們經(jīng)常使用lambada表達(dá)式進(jìn)行foreach循環(huán),但是常常我們?cè)诒闅vList的時(shí)候想獲取對(duì)象的index,但是Java8、9、10、11都沒(méi)有相關(guān)的支持,同樣的問(wèn)題也存在于增強(qiáng)型for循環(huán)中,很多時(shí)候不得不含著淚以 for (int i = 0; i < list.size(); i++) 的方式寫(xiě)代碼
list.foreach((item,index)->{}) //編譯不通過(guò)
常見(jiàn)的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還沒(méi)有這個(gè)方法
}
還有…
int i = 0;
for (String s : list) {
i++;
}
很顯然上述的方法并不是我們所想要的
我們看個(gè)簡(jiǎn)單的例子
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");
輸出結(jié)果:
single
multipart:double params
這里不難發(fā)現(xiàn)我們平時(shí)寫(xiě)的箭頭函數(shù)其實(shí)是一個(gè)Consumer或者BiConsumer對(duì)象
foreach源碼
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
分析源碼可知,我們的list foreach方法傳入的是Consumer對(duì)象,支持一個(gè)參數(shù),而我們想要的是item,index兩個(gè)參數(shù),很明顯不滿足,這時(shí)我們可以自定義一個(gè)Consumer,傳參是BiConsumer,這樣就能滿足我們需求了,代碼如下:
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
public class LambadaTools {
/**
* 利用BiConsumer實(shí)現(xiàn)foreach循環(huán)支持index
*
* @param biConsumer
* @param <T>
* @return
*/
public static <T> Consumer<T> forEachWithIndex(BiConsumer<T, Integer> biConsumer) {
/*這里說(shuō)明一下,我們每次傳入forEach都是一個(gè)重新實(shí)例化的Consumer對(duì)象,在lambada表達(dá)式中我們無(wú)法對(duì)int進(jìn)行++操作,
我們模擬AtomicInteger對(duì)象,寫(xiě)個(gè)getAndIncrement方法,不能直接使用AtomicInteger哦*/
class IncrementInt{
int i = 0;
public int getAndIncrement(){
return i++;
}
}
IncrementInt incrementInt = new IncrementInt();
return t -> biConsumer.accept(t, incrementInt.getAndIncrement());
}
}
調(diào)用示例:
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);
}));
輸出結(jié)果如下:
0:111
1:222
2:333
PS:這個(gè)Set也可以用哦,不過(guò)在Set使用中這個(gè)index可不是下標(biāo)
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“怎么使用Java中的foreach語(yǔ)句來(lái)獲取對(duì)象index下標(biāo)”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。