如何收集为Map<String, List<String>>并实现List排序?及代码改造
嘿,这两个问题我帮你梳理清楚~
问题一:收集为
Map<String, List<String>>且List有序 这里分两种场景来处理:
保持元素在流中的插入顺序:
Java默认的Collectors.toList()返回的ArrayList本身就是按元素被收集的顺序排列的,所以直接用常规的groupingBy即可。如果想要显式指定有序的List实现(比如LinkedList),可以替换成Collectors.toCollection(LinkedList::new),代码示例:Map<String, List<String>> orderedMap = yourStringStream .filter(...) // 你的过滤逻辑 .collect(Collectors.groupingBy( // 这里填分组的key提取规则,比如字符串的某个属性 s -> s.substring(0, 1), Collectors.toCollection(LinkedList::new) ));让List按自定义规则排序:
如果需要List按照特定逻辑(比如字符串自然排序、字典序等)排序,就用Collectors.collectingAndThen先收集元素到List,再对List进行排序,示例:Map<String, List<String>> sortedMap = yourStringStream .filter(...) .collect(Collectors.groupingBy( keyExtractor, Collectors.collectingAndThen( Collectors.toList(), list -> { // 按字符串自然排序,倒序的话可以加.reversed() list.sort(Comparator.naturalOrder()); return list; } ) ));
问题二:修改现有代码让List按
someStringField排序 你当前的代码已经用TreeMap保证了key的有序性,要让每个key对应的List<MyBean>按someStringField排序,只需要把最后一个参数的Collectors.toList()替换成collectingAndThen,在里面对List做排序处理。修改后的代码如下:
final TreeMap<String, List<MyBean>> map = elements.stream() .filter(....) // 保留你的过滤逻辑 .collect(Collectors.groupingBy( MyBean::getName, TreeMap::new, Collectors.collectingAndThen( Collectors.toList(), list -> { // 按someStringField字段自然排序,若需倒序可加.reversed() list.sort(Comparator.comparing(MyBean::getSomeStringField)); // 如果someStringField可能为null,建议处理空值,比如: // list.sort(Comparator.nullsFirst(Comparator.comparing(MyBean::getSomeStringField))); return list; } ) ));
内容的提问来源于stack exchange,提问作者gstackoverflow
相关产品推荐
相关产品推荐

