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

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

java8 簡化到映射的轉換

java8 簡化到映射的轉換

夢里花落0921 2022-08-03 15:25:21
我有這樣的類結構:public class A {    private List<B> bs;...//getters}public class C {    private Long id;...//getters}public class B {    private Long idOfC;...//more stuff}B::getIdOfC matchs C::getId在更好的設計中,B將只包含對C的引用,而不是它的id(我無法更改它),所以這就是為什么現在我需要創建一個映射,所以我的方法簽名看起來像這樣public Map<A, List<C>> convert(Collection<A> collection)在這個轉換方法中,有一個List<C> getCsByIds(List<Long> id) 后來用于將其與B.idOfC匹配,但是應該只有一次對此方法的調用,因為它非常昂貴。所以如果我這樣去: List<B> bs = Arrays.asList(new B(10L), new B(11L)); //10L and 11L are the values of idOfC   List<A> as = Arrays.asList(bs);   //And assuming getCsByIds returns Arrays.asList(new C(10L), new C(11L), new C(12L));然后    Map<A, List<C>> map = convert(as);    map.values().get(0) 返回類似的東西Arrays.asList(new C(10L), new C(11L))在我看來,這樣做的方法非常龐大:    public Map<A, List<C>> convert(Collection<A> as) {    List<Long> cIds = as.stream()            .flatMap(a -> a.getBs().stream())            .map(B::getCId)            .collect(Collectors.toList());    //single call to gsCsByIds    Map<Long, C> csMap = getCsByIds(cIds)            .stream()            .collect(Collectors.toMap(C::getId, Function.identity()));    //a whole new map is created by iterating over the list called "as"    Map<A, List<C>> csByAs = new HashMap<>();    if (!csMap.isEmpty()) {        for (A a : as) {            Set<C> cs = getCsFromMap(csMap, a.getBs());            if (!cs.isEmpty()) {                csByAs.put(a, new ArrayList<>(cs));            }        }    }    return csByAs;}private Set<B> getCsFromMap(Map<Long, C> cMap, List<B> bs) {    return bs.stream()            .map(b -> cMap.get(b.getIdOfc()))            .collect(Collectors.toSet());}有沒有辦法讓它更簡單???
查看完整描述

3 回答

?
www說

TA貢獻1775條經驗 獲得超8個贊

如果調用成本很高,那么您最初的想法可以自行執行。它可以進一步縮短為:getCsByIds


public Map<A, List<C>> convert(Collection<A> as) {

    List<Long> cIds = as.stream()

            .flatMap(a -> a.getBs().stream())

            .map(B::getIdOfC)

            .collect(Collectors.toList());

    Map<Long, C> csMap = getCsByIds(cIds).stream()

            .collect(Collectors.toMap(C::getId, Function.identity()));


    return as.stream()

            .collect(Collectors.toMap(Function.identity(),

                    a -> a.getBs().stream().map(b -> csMap.get(b.getIdOfC()))

                            .collect(Collectors.toList()), (a, b) -> b));

}

您可以在其中相應地選擇合并功能。(a,b) -> b


查看完整回答
反對 回復 2022-08-03
?
翻閱古今

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

也許只是直接迭代 As?(手頭沒有編譯器,所以也許代碼段還沒有編譯就緒)


public Map<A, List<C>> convert(Collection<A> as) {

  Map<A, List<C>> result = new HashMap<>();

  for(A a: as){

     List<Long> cIds = a.getBs().stream()

                         .map(B::getIdOfC)

                         .collect(Collectors.toList());

     result.put(a, getCsByIds(cIds));

  }

  return result;

}


查看完整回答
反對 回復 2022-08-03
?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

這樣的事情難道行不通嗎?我沒有編譯器,所以我無法真正測試它


public Map<A, List<C>> convert(Collection<A> as) {

    return as.stream()

             .collect(Collectors.toMap(Function::identity,

                                       a -> a.getBs().stream()

                                                     .map(B::getIdOfC)

                                                     .flatMap(id -> getCsByIds(asList(id))

                                                                   .values()

                                                                   .stream())

                                                     .collect(Collectors.toList())

                                      )

                     );

}


查看完整回答
反對 回復 2022-08-03
  • 3 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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