亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java8 stream根據下標分組

java8 stream根據下標分組

繁星點點滴滴 2018-08-29 18:25:21
我有個list想要按照奇偶下標生成兩組list,只利用java8的stream可以做到嗎?比如[1,3,5,7,9],按照奇偶下標分成[1,5,9]和[3,7],但是stream似乎無法獲取下標,所以試了半天也不行。另外,java8的stream以后可以完全取代for循環嗎?我感覺有些復雜的邏輯拿stream折騰不是一個好的選擇
查看完整描述

2 回答

?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

[1, 3, 5, 7, 9]的偶數下標數組:

    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]


查看完整回答
反對 回復 2018-09-16
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

這個要從為什么java8會弄出stream這種循環方式說起了

以前的for循環是屬于外部循環,由調用者自己顯式的取出每個元素加以處理,尤其是并行處理時,非常痛苦

而stream是屬于內部循環,你可以無需關心它是如何循環的,要是并行的時候如何優化,這些你都可以不管,你只需要簡簡單單告訴他需要做什么處理即可

舉個簡單的例子:

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

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

例子可能很牽強,但是我們作為開發者,就是爸爸,只需要告訴兒子(JDK)把球放進盒子這個動作就好,具體兒子怎么放,一次一個手拿一個,還是一次每個手拿一個,由它自己來思考,不需要我們去指揮,我們只關注具體需要做的事就好

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

其實不然,寫肯定能寫的,只是說換一種方式而已,不把下標當成循環用的元素,而是把它與具體需要循環的數字綁定起來,寫出來差不多是這個樣子

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()

                                                      // 把數字和下標綁定起來

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

                                                      // 按照下標是否能被2整除進行分組

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

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

        // 偶數列表 3,9

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

        // 奇數列表 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);

    }


查看完整回答
反對 回復 2018-09-16
  • 2 回答
  • 0 關注
  • 1243 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號