繁体   English   中英

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

[英]How to construct a Map using with object properties as key using java stream and toMap or flatMap

我有对象列表,需要创建一个 Map 键是该对象中两个属性的组合。 如何在 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));

    }

}

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

像这样试试。

  • map 的 key 参数是键和您描述的值的串联。
  • 值只是对象
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));

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

作为上面的两个答案,您可以使用获取2个函数作为输入的toMap函数,第一个是获取唯一键的方式,第二个是如何获取数据。

我们更喜欢在自己的类中保存唯一的键,并使用 Class::Method 作为键的函数直接从该类调用键的函数,它使代码更具可读性,而不是使用嵌套的 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

[英]Getting the stream object in Collectors toMap method using Method References in Java 8

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM