【问题标题】:Java Stream Maintain Map order generated by Collectors.groupingBy() [duplicate]Java Stream维护Collectors.groupingBy()生成的地图顺序[重复]
【发布时间】:2017-09-15 17:55:04
【问题描述】:

我有一个字符串类型的数据列表,试图将每个字符串的计数设为Map<String, Long>

List<String> dataList = new ArrayList();
dataList.addAll(Arrays.asList(new String[] {"a", "z", "c", "b", "a"}));
System.out.println(dataList.stream().collect(Collectors.groupingBy(w -> w, Collectors.counting())));

输出为{a=2, b=2, c=1, z=1}。我希望输出保持列表中提供的顺序。比如{a=2, z=1, c=1, b=2}

LinkedHashMap 将保持顺序,但不确定如何使用Collectors.groupingBy() 将输出转换为LinkedHashMap

尝试使用Java8-stream解决问题

【问题讨论】:

标签: java-8 stream java-stream


【解决方案1】:

对于这种情况,您应该使用groupingBy(Function&lt;? super T,? extends K&gt; classifier, Supplier&lt;M&gt; mapFactory,Collector&lt;? super T,A,D&gt; downstream) 函数:

代码示例:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.groupingBy;

public class Main {

    public static void main(String[] args){
        List<String> dataList = new ArrayList();
        dataList.addAll(Arrays.asList("a", "z", "c", "b", "a"));
        System.out.println(dataList.stream().collect(groupingBy(w -> w, (Supplier<LinkedHashMap<String, Long>>) LinkedHashMap::new, Collectors.counting())));
    }
}

输出:

{a=2, z=1, c=1, b=1}

参考资料:Oracle Documentation

【讨论】:

  • 类型转换 (Supplier&lt;LinkedHashMap&lt;String, Long&gt;&gt;) 应该不是必需的。一个简单的dataList.stream().collect(groupingBy(w -&gt; w, LinkedHashMap::new, counting())) 应该可以……
【解决方案2】:

根据 JB Nizet dataList.stream().collect(Collectors.groupingBy(w -&gt; w, LinkedHashMap::new, Collectors.counting()))

【讨论】:

    【解决方案3】:

    不像给定的解决方案那么简单,只是为了说明:您也可以使用 TreeMap 以及合适的 Comparator,例如:

    List<Character> list = Arrays.asList('q', 'a', 'z', 'c', 'b', 'z', 'a');
    Comparator<Character> comp = Comparator.comparing(list::indexOf);
    Map<Character, Long> map = list.stream()
        .collect(groupingBy(c -> c, () -> new TreeMap<>(comp), counting()))
    ;
    System.out.println(map);
    

    【讨论】:

      猜你喜欢
      • 2017-10-12
      • 1970-01-01
      • 2015-09-12
      • 2013-10-10
      • 2018-06-16
      • 2020-01-06
      • 2011-02-27
      • 2011-03-29
      • 2020-07-01
      相关资源
      最近更新 更多