如何创建一个HashMap来迭代lambda函数?

Isr*_*ues 2 java lambda java-8

有没有办法在lambda函数内创建这个hashmap?

        Map<SaleStatus, Long> sales = new HashMap<>();
    saleStatusCounters.forEach(saleStatusCounter -> sales.put(saleStatusCounter.getStatus(), saleStatusCounter.getMatches()));
Run Code Online (Sandbox Code Playgroud)

像这样的东西:

        saleStatusCounters.stream()
            .map(obj -> new HashMap<SaleStatus, Long>().put(obj.getStatus(), obj.getMatches()))
            .collect(Collectors.toMap(???)));
Run Code Online (Sandbox Code Playgroud)

Fed*_*ner 5

你的代码很好.但是,您可以使用流并Collectors.toMap获得所需的结果:

Map<SaleStatus, Long> sales = saleStatusCounters.stream()
    .collect(Collectors.toMap(obj -> obj.getStatus(), obj -> obj.getMatches()));
Run Code Online (Sandbox Code Playgroud)

注意:只要地图中没有碰撞,即只要您没有两个或更多具有相同状态的销售状态计数器对象,此功能就会起作用.

如果列表中有多个具有相同状态的元素,则应使用Collectors.toMap需要合并函数的重载版本:

Map<SaleStatus, Long> sales = saleStatusCounters.stream()
    .collect(Collectors.toMap(
        obj -> obj.getStatus(), 
        obj -> obj.getMatches(),
        Long::sum));
Run Code Online (Sandbox Code Playgroud)

Long::sum是一个BinaryOperator<Long>合并两个映射到同一个键的值.