簡體   English   中英

Java Streams - 如何在使用 Collector groupingBy() 時保留元素的初始順序

[英]Java Streams - How to preserve the initial Order of elements while using Collector groupingBy()

我正在嘗試將對象列表轉換為對象列表列表,即將List<T>轉換為List<List<T>>並通過用作排序的字符串列表對它們進行分組。

問題是在groupingBy()之后,返回值是一個映射,並且映射不同的值順序。

我可以做些什么來保留列表groupedTreesList中元素的初始順序?

我的代碼:

Map<List<String>,List<QueryTreeProxy>> groupedMap = treesProxyList.stream()
    .collect(Collectors.groupingBy(
        QueryTreeProxy::getMappingKeys,
        Collectors.toList()
    ));

List<List<QueryTreeProxy>> groupedTreesList = groupedMap.values().stream().toList();

groupingBy() ,返回值是一個映射,該映射輸出不同順序的值列表

您可以使用另一種groupingBy(classifier, mapFactory, downstream) ,它允許您指定 Map 的類型。 我們可以使用LinkedHashMap來保存初始順序。

並且不需要生成第二個流,您可以使用ArrayList的參數化承包商來代替。

Map<List<String>, List<QueryTreeProxy>> groupedMap = treesProxyList.stream()
    .collect(Collectors.groupingBy(
        QueryTreeProxy::getMappingKeys,
        LinkedHashMap::new,
        Collectors.toList()
    ));
    
List<List<QueryTreeProxy>> groupedTreesList = new ArrayList<>(groupedMap.values());

除此之外,使用可變對象作為鍵並不是一個好習慣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM