lambda -- list转map

package com.example.demo.util;

import com.example.demo.entity.UserPO;
import com.google.common.collect.Maps;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 过滤list中对象的某个属性非空,然后返回一个新的list
 */
public class LambdaForList {
    public static void main(String[] args) {
        //1. 初始化数据
        UserPO user1 = new UserPO(1, "java");
        UserPO user2 = new UserPO(2, "C");
        UserPO user3 = new UserPO(3, "PHP");
        List<UserPO> users = new ArrayList<>();
        users.add(user1);
        users.add(user2);
        users.add(user3);

        //3. list转map
        Map<Integer, String> userMap = Maps.newHashMap();
        userMap = users.stream().collect(Collectors.toMap(UserPO::getId, UserPO::getName));
        System.out.println(userMap.toString());
    }
}

输出

{1=java, 2=C, 3=PHP}

常见错误异常

java.lang.IllegalStateException: Duplicate key java

对应代码块:

package com.example.demo.util;

import com.example.demo.entity.UserPO;
import com.google.common.collect.Maps;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class LambdaForList {
    public static void main(String[] args) {
        //1. 初始化数据
        UserPO user1 = new UserPO(1, "java");
        UserPO user2 = new UserPO(2, "C");
        UserPO user3 = new UserPO(1, "PHP");
        List<UserPO> users = new ArrayList<>();
        users.add(user1);
        users.add(user2);
        users.add(user3);

        //3. list转map
        Map<Integer, String> userMap = Maps.newHashMap();
        userMap = users.stream()
                .collect(Collectors
                        .toMap(UserPO::getId, UserPO::getName));
        System.out.println(userMap.toString());
    }
}

异常信息:

Exception in thread "main" java.lang.IllegalStateException: Duplicate key java
	at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
	at java.util.HashMap.merge(HashMap.java:1254)
	at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
	at com.example.demo.util.Test.main(Test.java:27)

分析:user1和user3的id都是1,导致key重复
解决JDK8中Collectors.toMap方法报Duplicate key xxx错误信息
Duplicate key
代码块:

package com.example.demo.util;

import com.example.demo.entity.UserPO;
import com.google.common.collect.Maps;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class LambdaForList {
    public static void main(String[] args) {
        //1. 初始化数据
        UserPO user1 = new UserPO(1, "java");
        UserPO user2 = new UserPO(2, "C");
        UserPO user3 = new UserPO(1, "PHP");
        List<UserPO> users = new ArrayList<>();
        users.add(user1);
        users.add(user2);
        users.add(user3);

        //3. list转map
        Map<Integer, String> userMap = Maps.newHashMap();
        userMap = users.stream()
                .collect(Collectors
                        .toMap(UserPO::getId, UserPO::getName, (value1,value2) -> value2));
        System.out.println(userMap.toString());
    }
}

输出

{1=PHP, 2=C}

版权声明:本文为expect521原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。