我有一个字符串类型的数据列表,试图将每个字符串的计数作为 Map<String, Long> 。
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} 。
{a=2, b=2, c=1, z=1}
{a=2, z=1, c=1, b=2}
LinkedHashMap 将保持顺序,但不确定如何使用 Collectors.groupingBy() 将输出转换为 LinkedHashMap 。
LinkedHashMap
Collectors.groupingBy()
试图使用Java8 8流解决问题。
发布于 2017-09-15 18:28:29
对于这种情况,您应该使用 groupingBy(Function<? super T,? extends K> classifier, Supplier<M> mapFactory,Collector<? super T,A,D> downstream) 函数:
groupingBy(Function<? super T,? extends K> classifier, Supplier<M> mapFactory,Collector<? super T,A,D> 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())));