Java 8 int数组要映射

时间:2019-06-01 12:11:57

标签: java java-8 java-stream

我要将 int数组转换为

Map<Integer,Integer> 

使用Java 8流api

int[] nums={2, 7, 11, 15, 2, 11, 2};
Map<Integer,Integer> map=Arrays
                .stream(nums)
                .collect(Collectors.toMap(e->e,1));

我想得到一个如下图,键将是整数值,值将是每个键的总数

  

map = {2-> 3,7-> 1,11-> 2,15-> 1}

编译器抱怨“ 不存在类型变量T,U的实例,因此Integer确认对函数

赞赏任何指针来解决这个问题

3 个答案:

答案 0 :(得分:5)

您需要将groupingBy装箱,然后使用Map<Integer, Long> map = Arrays .stream(nums) .boxed() // this .collect(Collectors.groupingBy(e -> e, Collectors.counting())); 值来获取计数:

reduce

或将Map<Integer, Integer> map = Arrays .stream(nums) .boxed() .collect(Collectors.groupingBy(e -> e, Collectors.reducing(0, e -> 1, Integer::sum))); 用作:

{{1}}

答案 1 :(得分:3)

您必须在流上调用.boxed()才能将IntStream转换为Stream<Integer>。然后,您可以使用Collectors.groupingby()Collectors.summingInt()来计算值:

Map<Integer, Integer> map = Arrays.stream(nums).boxed()
        .collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(i -> 1)));

答案 2 :(得分:2)

您还可以完成对整数的计数,而无需将int的值装箱到Map<Integer, Integer>Map<Integer, Long>中。如果您使用Eclipse Collections,则可以按照以下方式将IntStream转换为IntBag

int[] nums = {2, 7, 11, 15, 2, 11, 2};
IntBag bag = IntBags.mutable.withAll(IntStream.of(nums));
System.out.println(bag.toStringOfItemToCount());

输出:

{2=3, 7=1, 11=2, 15=1}

您还可以直接从IntBag数组构造int

IntBag bag = IntBags.mutable.with(nums);

注意:我是Eclipse Collections的提交者。