Map 保持键的唯一性,即当您尝试使用现有键添加元素时,旧值将被新值替换。您可以通过下面给出的示例来理解它:
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> m1 = new HashMap<>();
m1.put("a", 1);
m1.put("b", 2);
m1.put("a", 3);
m1.put("c", 10);
m1.put("c", 50);
System.out.println(m1);
}
}
输出:
{a=3, b=2, c=50}
如您所见,3 已替换 1,因为它已使用相同的密钥 a 放入密钥中。
如果您需要保持 3 和 1 具有相同的键/ID,您可以实现您的自定义类型,例如:
class Item {
private String id;
private int val;
//Constructors, getters and setters
}
然后,将Item 的实例添加到List 例如
List<Item> list = new ArrayList<Item>();
list.add(new Item("a", 1));
list.add(new Item("b", 2));
list.add(new Item("a", 3));
list.add(new Item("c", 10));
list.add(new Item("c", 50));
最后,您可以将id上的项目分组并计算总和如下:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
class Item {
private String id;
private int val;
public Item(String id, int val) {
this.id = id;
this.val = val;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getVal() {
return val;
}
public void setVal(int val) {
this.val = val;
}
@Override
public String toString() {
return "Item [id=" + id + ", val=" + val + "]";
}
}
public class Main {
public static void main(String[] args) {
List<Item> list = new ArrayList<Item>();
list.add(new Item("a", 1));
list.add(new Item("b", 2));
list.add(new Item("a", 3));
list.add(new Item("c", 10));
list.add(new Item("c", 50));
list.stream().collect(Collectors.groupingBy(item -> item.getId(), Collectors.summingInt(item -> item.getVal())))
.forEach((id, sumVal) -> System.out.println("Sum of " + id + " = " + sumVal));
}
}
输出:
Sum of a = 4
Sum of b = 2
Sum of c = 60