java8 lambda 将list对象改为Map对象

list转map

java8 lambda将List转换为Map比较简单,但是 有坑:

		List<Boy> sellOutList = Lists.newArrayList();
        Boy one = new Boy();
        one.setId(34343);
        sellOutList.add(one);
        Boy two = new Boy();
        two.setId(34343);
        sellOutList.add(two);
        Map<Integer, Boy> res = sellOutList.stream().collect(Collectors.toMap(Boy::getId, Function.identity()));
        System.out.println(res.entrySet());
        
		public static class Boy{
        int id;

        int age;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }

注意这里使用的是:Function.identity();
这里运行会报错,报错信息:

java.lang.IllegalStateException: Duplicate key com.serviceTest.ServiceTest$Boy@6c6017b9

	at java.util.stream.Collectors.lambda$throwingMerger$106(Collectors.java:133)
	at java.util.stream.Collectors$$Lambda$4/38625764.apply(Unknown Source)
	at java.util.HashMap.merge(HashMap.java:1245)
	at java.util.stream.Collectors.lambda$toMap$164(Collectors.java:1320)
	at java.util.stream.Collectors$$Lambda$6/940448009.accept(Unknown Source)
	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
	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 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:483)
	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
	at org.testng.internal.MethodInvocationHelper$1.runTestMethod(MethodInvocationHelper.java:182)
	at org.springframework.test.context.testng.AbstractTestNGSpringContextTests.run(AbstractTestNGSpringContextTests.java:171)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:483)
	at org.testng.internal.MethodInvocationHelper.invokeHookable(MethodInvocationHelper.java:194)
	at org.testng.internal.Invoker.invokeMethod(Invoker.java:707)
	at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
	at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
	at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
	at org.testng.TestRunner.privateRun(TestRunner.java:767)
	at org.testng.TestRunner.run(TestRunner.java:617)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
	at org.testng.SuiteRunner.run(SuiteRunner.java:240)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1198)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1123)
	at org.testng.TestNG.run(TestNG.java:1031)
	at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
	at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)

Function.identity() 换成 c->c,(k1, k2)->k2)

正确的写法:

		List<Boy> sellOutList = Lists.newArrayList();
        Boy one = new Boy();
        one.setId(34343);
        sellOutList.add(one);
        Boy two = new Boy();
        two.setId(34343);
        sellOutList.add(two);
        Map<Integer, Boy> res = sellOutList.stream().collect(Collectors.toMap(Boy::getId, c->c,(k1, k2)->k2));
        System.out.println(res.entrySet());

这样就不会报错了。

参考博客

常用lambda(Map相关)

    原文作者:荷马先生
    原文地址: https://blog.csdn.net/randompeople/article/details/88237814
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞