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

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

在 Java 流中執(zhí)行 Reduce 操作時出現(xiàn)異常

在 Java 流中執(zhí)行 Reduce 操作時出現(xiàn)異常

FFIVE 2022-08-03 15:30:36
我是Java 8的新手,在下面的示例中,我創(chuàng)建了一個映射,其鍵值為字符串,值為整數(shù)的數(shù)組列表。Map<String,List<Integer>> mapLstInteger=new HashMap<String,List<Integer>>() {            {                put("A",Arrays.asList(1,2,3));                put("B",Arrays.asList(4,5,6));                put("C",Arrays.asList(7,8,9));            }        };我編寫了以下代碼來針對每個鍵執(zhí)行 arrayList 元素的總和,并嘗試將總和值存儲在單獨的 ArrayList 中。List<Integer> sumLst=mapLstInteger.entrySet().stream().map(e->e.getValue())        .reduce((inputLst, outputLst)->{            int sum=0;            for(int count=0;count<inputLst.size();count++)            {                sum=sum+inputLst.get(count);            }            outputLst.add(sum);            return outputLst;        }).get();當(dāng)我嘗試執(zhí)行下面的代碼時,我得到下面的異常。線程 “main” java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at com.computing.sum.client.Client.lambda$1(Client.java:43) at java.util.stream.ReduceOps$2ReducingSink.accept(ReduceOps.java:123) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.HashMap$EntrySpliterator.forEachRemaining(HashMap.java:1696) atjava.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.reduce(ReferencePipeline.java:479) at com.computing.sum.client.client.main(Client.java:37)任何人都可以讓我知道你在上面的代碼中做錯了什么>
查看完整描述

3 回答

?
慕尼黑5688855

TA貢獻1848條經(jīng)驗 獲得超2個贊

首先,您使用的是返回由指定數(shù)組支持的固定大小的列表,我認(rèn)為固定大小應(yīng)該告訴您做錯了什么。Arrays::asList

比你正在使用一個反模式來創(chuàng)建一個到位 - 通過創(chuàng)建一個匿名的內(nèi)部類,該類通過該.HashMapHashMapMap<String,List<Integer>> mapLstInteger=new HashMap<String,List<Integer>>()....

比,你違反了 的規(guī)范,它應(yīng)該一直返回一個新的對象,但你總是把 放入 。reduceoutputLst

比,你正在創(chuàng)造一個當(dāng)你所關(guān)心的只是它的價值 - 在這種情況下創(chuàng)建一個。MapList<List<Integer>>

根據(jù)你的代碼,即使是我在代碼下面寫的句子,對每個鍵執(zhí)行arrayList元素的總和也是不正確的。我會在我想要實現(xiàn)的實際事情上下定決心,然后如果我是你,我會嘗試去做。


查看完整回答
反對 回復(fù) 2022-08-03
?
森林海

TA貢獻2011條經(jīng)驗 獲得超2個贊

發(fā)生這種情況是因為您正在使用 由 生成的原始版本。

該抽象實現(xiàn)不允許添加或刪除元素。AbstractListArrays.asListList<T>


public void add(int index, E element) {

    throw new UnsupportedOperationException();

}

但無論如何,回到你的問題。您也可以通過 自定義 獲得所需的內(nèi)容,您可以在其中提供自定義實現(xiàn),無論是 、 還是 其他任何您認(rèn)為更好的實現(xiàn)。CollectorList<T>ArrayListLinkedList


mapLstInteger.values()

             .stream()

             .collect(Collector.of(

                     () -> new ArrayList<>(),  // Supplier

                     (output, toSumList) -> {  // Accumulator

                         output.add(toSumList.stream()

                                             .mapToInt(Integer::intValue)

                                             .sum());

                     },

                     // The Combiner implementation will be called

                     // in case of a "parallel" Stream. 

                     // No need to worry about it here. 

                     // But in case, we would need to merge the partial results

                     (output, partial) -> {

                        output.addAll(partial);

                        return output;

                     }

             ));

一個更簡潔的版本是


mapLstInteger.values()

             .stream()

             .map(l -> l.stream().mapToInt(Integer::intValue).sum())

             .collect(Collectors.toCollection(ArrayList::new));

這將正確輸出[6, 15, 24]


查看完整回答
反對 回復(fù) 2022-08-03
?
慕村225694

TA貢獻1880條經(jīng)驗 獲得超4個贊

您應(yīng)該執(zhí)行以下操作:

    mapLstInteger.values().stream()
                 .flatMapToInt(list -> list.stream()
                                           .filter(Objects::nonNull)
                                           .mapToInt(Integer::intValue)).sum();

添加了篩選器,以確保在空整數(shù)的情況下不會獲得空指針。作為一般規(guī)則,如果您被迫在流中使用常規(guī)循環(huán),則可能做錯了什么。通過將 int 列表轉(zhuǎn)換為 int 值,我們可以很容易地求和,如您上所示。

最初誤解了問題,認(rèn)為你想要的總體總和,唉,這是實際問題的更新解決方案:

    mapLstInteger.values().stream()
                 .map(list -> list.stream()
                                  .filter(Objects::nonNull)
                                  .mapToInt(Integer::intValue).sum())
                                  .collect(Collectors.toList());


查看完整回答
反對 回復(fù) 2022-08-03
  • 3 回答
  • 0 關(guān)注
  • 243 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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