如何使用 java 流和 toMap 或 flatMap 以对象属性作为键来构造地图
How to construct a Map using with object properties as key using java stream and toMap or flatMap
我有对象列表,需要创建一个映射,键是该对象中两个属性的组合。如何在Java中实现 8.
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 函数仅支持单参数函数,因为键无法创建键,如 StateCd+StateNbr.
像这样尝试。
- map 的关键参数是键和您描述的值的串联。
- 值只是对象
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()));
我已修复以下实现。
Function<PersonDTO, String> keyFun = person -> person.getStateCd()+person.getStateNbr();
Map<String, PersonDTO> personMap = personDtoList.stream().collect(Collectors.toMap(keyFun,
Function.identity(),(v1,v2)-> v2));
如果我们遇到重复密钥,这将在创建动态密钥时起作用。
如上两个答案,可以使用toMap函数获取2个函数作为输入,第一个是获取唯一键的方式,第二个是获取数据的方式。
我们更喜欢将唯一键保存在 class 自身中,并使用 Class::Method 作为键的函数直接从 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));
注意这和上面的逻辑完全一样
我有对象列表,需要创建一个映射,键是该对象中两个属性的组合。如何在Java中实现 8.
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 函数仅支持单参数函数,因为键无法创建键,如 StateCd+StateNbr.
像这样尝试。
- map 的关键参数是键和您描述的值的串联。
- 值只是对象
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()));
我已修复以下实现。
Function<PersonDTO, String> keyFun = person -> person.getStateCd()+person.getStateNbr();
Map<String, PersonDTO> personMap = personDtoList.stream().collect(Collectors.toMap(keyFun,
Function.identity(),(v1,v2)-> v2));
如果我们遇到重复密钥,这将在创建动态密钥时起作用。
如上两个答案,可以使用toMap函数获取2个函数作为输入,第一个是获取唯一键的方式,第二个是获取数据的方式。
我们更喜欢将唯一键保存在 class 自身中,并使用 Class::Method 作为键的函数直接从 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));
注意这和上面的逻辑完全一样