Java8流将列表转换为映射,其中映射键是从列表的两个字段派生的对象?
class Person{
private String first;
private String last;
private BigDecimal gpa;
private int age;
}
class PersonKey{
private String first;
private String last;
}
现在我有了List<Person>
,我想把它转换成Map<PersonKey, Person>
,其中PersonKey
只是一个人的唯一键值。如何使用Java流实现这一点
# 1 楼答案
上课
另外两个答案是正确的here
<>但是如果你用这个人的全名,考虑写一个班。如果你在其他地方使用这样的全名,那么就更有理由创建一个类在Java16及更高版本中,您可以选择使用新的record特性来更简单地定义类。在主要目的是以透明和不变的方式传输数据的情况下使用记录。编译器隐式地创建构造函数getters,
equals
&hashCode
和toString
所以你的
Person
类看起来像这样用法示例
你的地图应该是这样的
顺便说一句,在实践中,使用人名作为标识符几乎总是一个糟糕的想法。这就是为什么给学生分配学生识别号,员工获得员工ID,护照获得官方护照号,等等。我在回答问题时忽略了这个问题,而是把注意力集中在其他问题上……但要提前得到警告
# 2 楼答案
你可能需要小心重复的钥匙。如果键是重复的,那么就会抛出一个
IllegalStateException
对于复制键,请尝试以下操作:
或者你可以使用
Function.identity()
来代替这个目的如果要求按键分组,并且不删除任何值(在重复键的情况下),请使用
groupingBy
(如@WJS所建议的):# 3 楼答案
我相信这就是你想要的(假设没有两个人同名)。密钥是使用Person的getter和PersonKey的构造函数动态构造的
为了容纳同名的人,你可以把他们放在
Map<PersonKey,List<Person>>