第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

java8 stream根據(jù)下標(biāo)分組

java8 stream根據(jù)下標(biāo)分組

我有個(gè)list想要按照奇偶下標(biāo)生成兩組list,只利用java8的stream可以做到嗎?比如[1,3,5,7,9],按照奇偶下標(biāo)分成[1,5,9]和[3,7],但是stream似乎無法獲取下標(biāo),所以試了半天也不行。另外,java8的stream以后可以完全取代for循環(huán)嗎?我感覺有些復(fù)雜的邏輯拿stream折騰不是一個(gè)好的選擇
查看完整描述

2 回答

?
呼喚遠(yuǎn)方

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊

[1, 3, 5, 7, 9]的偶數(shù)下標(biāo)數(shù)組:

    int[] i = new int[] {0};
    System.out.println(Arrays.toString(IntStream.of(1, 3, 5, 7, 9).filter(n -> i[0]++ % 2 == 0).toArray()));

得到[1, 5, 9]


查看完整回答
反對(duì) 回復(fù) 2018-09-16
?
慕運(yùn)維8079593

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊

這個(gè)要從為什么java8會(huì)弄出stream這種循環(huán)方式說起了

以前的for循環(huán)是屬于外部循環(huán),由調(diào)用者自己顯式的取出每個(gè)元素加以處理,尤其是并行處理時(shí),非常痛苦

而stream是屬于內(nèi)部循環(huán),你可以無需關(guān)心它是如何循環(huán)的,要是并行的時(shí)候如何優(yōu)化,這些你都可以不管,你只需要簡簡單單告訴他需要做什么處理即可

舉個(gè)簡單的例子:

地上有很多乒乓球,爸爸要讓你兒子撿起來放到盒子里
如果是外部循環(huán),可能這種模式
爸爸:地上還有球么
兒子:有
爸爸:那把它撿起來放到盒子里,還有么?
兒子:有
爸爸:繼續(xù)撿起來放到盒子里,還有么?
兒子:有
爸爸:接著撿起來放到盒子里,還有么?
兒子:沒有了
爸爸:ok,收拾好了

如果是內(nèi)部循環(huán)
爸爸:把地上的球撿起來全部放到盒子里
兒子:好,完成

例子可能很牽強(qiáng),但是我們作為開發(fā)者,就是爸爸,只需要告訴兒子(JDK)把球放進(jìn)盒子這個(gè)動(dòng)作就好,具體兒子怎么放,一次一個(gè)手拿一個(gè),還是一次每個(gè)手拿一個(gè),由它自己來思考,不需要我們?nèi)ブ笓],我們只關(guān)注具體需要做的事就好

所以說stream是一種內(nèi)部循環(huán),你不需要去關(guān)注下標(biāo)...關(guān)注下標(biāo)的話,從某種意義上來說,還是外部循環(huán)的思想在處理了,當(dāng)然題主的問題中,明確就是要求是關(guān)注下標(biāo)了,貌似好像stream是沒法寫似的

其實(shí)不然,寫肯定能寫的,只是說換一種方式而已,不把下標(biāo)當(dāng)成循環(huán)用的元素,而是把它與具體需要循環(huán)的數(shù)字綁定起來,寫出來差不多是這個(gè)樣子

public static void main(String[] args) {

        List<Integer> list = Arrays.asList(1,3,5,7,9);


        Map<Boolean, List<Integer>> collect = IntStream.rangeClosed(1, list.size())

                                                      .boxed()

                                                      // 把數(shù)字和下標(biāo)綁定起來

                                                      .map(i -> mapToEntry(i, list.get(i-1)))

                                                      // 按照下標(biāo)是否能被2整除進(jìn)行分組

                                                      .collect(Collectors.partitioningBy(simpleEntry -> Integer.parseInt(simpleEntry.getKey().toString()) % 2 == 0,

                                                               Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

        // 偶數(shù)列表 3,9

        List<Integer> evenList = collect.get(Boolean.TRUE);

        // 奇數(shù)列表 1,5,7

        List<Integer> oddList = collect.get(Boolean.FALSE);

    }


    private static AbstractMap.SimpleEntry<Integer, Integer> mapToEntry(Integer i, Integer integer) {

        return new AbstractMap.SimpleEntry(i, integer);

    }


查看完整回答
反對(duì) 回復(fù) 2018-09-16
  • 2 回答
  • 0 關(guān)注
  • 1256 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)