如何使用java流和toMap或flatMap来构造一个以对象属性为键的Map



我有一个对象列表,需要创建一个Map。键是该对象中两个属性的组合。如何在Java8。

public class PersonDTOFun {
/**
* @param args
*/
public static void main(String[] args) {

List<PersonDTO> personDtoList = new ArrayList<>();

PersonDTO ob1 = new PersonDTO();

ob1.setStateCd("CT");
ob1.setStateNbr("8000");

personDtoList.add(ob1);


PersonDTO ob2 = new PersonDTO();

ob2.setStateCd("CT");
ob2.setStateNbr("8001");

personDtoList.add(ob2);

PersonDTO ob3 = new PersonDTO();

ob3.setStateCd("CT");
ob3.setStateNbr("8002");

personDtoList.add(ob3);

Map<String,PersonDTO> personMap = new HashMap<>();
//personMap should contain 
Map<String, PersonDTO> personMap = personDtoList.stream().collect(Collectors.toMap(PersonDTO::getStateCd, 
               Function.identity(),(v1,v2)-> v2));
}
}

在上面的代码中,想要构造personMap,键为StateCd+StateNbr并且值为PersonDTO。由于现有的流和toMap函数只支持单参数函数,因为key不能创建一个键作为StateCd+StateNbr

这样试试吧。

  • 要映射的键参数是键和您描述的值的串联
  • 值只是对象
Map<String, PersonDTO> personMap =
personDtoList
.stream()
.collect(Collectors.toMap(p->p.getStateCd() + p.getStateNbr(), p->p));
  • 如果你认为你会有重复的键,那么你有几个选择,包括合并功能
  • 下面显示的一个保留遇到的第一个键(现有(的值
Map<String, PersonDTO> personMap =
personDtoList
.stream()
.collect(Collectors.toMap(p->p.getStateCd() + p.getStateNbr(), p->p,
(existingValue, lastestValue)-> existingValue));
  • 下一个保存PersonDTO的所有实例,并将相同的键值放入列表中
Map<String, List<PersonDTO>> personMap =
personDtoList
.stream()
.collect(Collectors.groupingBy(p->p.getStateCd() + 
p.getStateNbr()));

作为上面的两个答案,您可以使用toMap函数,它获得两个函数作为输入,第一个是获得唯一密钥的方法,第二个是如何获得数据。

我们更喜欢将唯一的键保存在类中,并使用class::方法直接从该类调用键的函数作为键的函数,这使代码更可读,而不是使用嵌套的lambda函数

因此使用WJS示例:

Map<String, PersonDTO> personMap =
personDtoList
.stream()
.collect(Collectors.toMap(p->p.getStateCd() + p.getStateNbr(), p->p));
Map<String, PersonDTO> personMap =
personDtoList
.stream()
.collect(Collectors.toMap(PersonDTO::getUniqueKey, p->p));

请注意,这与上述逻辑完全相同

我已经修复了以下实现。

Function<PersonDTO, String> keyFun = person -> person.getStateCd()+person.getStateNbr();
Map<String, PersonDTO> personMap = personDtoList.stream().collect(Collectors.toMap(keyFun, 
               Function.identity(),(v1,v2)-> v2));

如果我们遇到重复的密钥,这将在创建动态密钥时起作用。

最新更新