Collectors.toMap的使用

一、Collectors.toMap的三個重載方法:

toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper);
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,
        BinaryOperator<U> mergeFunction);
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,
        BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier);

參數含義分別是:

keyMapper:Key 的映射函數

valueMapper:Value 的映射函數

mergeFunction:當 Key 衝突時,調用的合併方法

mapSupplier:Map 構造器,在需要返回特定的 Map 時使用

業務場景最多的還是map的鍵爲一個唯一的標識符,值爲對象本身!

二、例子使用:

Person:

查看代碼
 package com.mayikt.entity;

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

測試代碼:

package com.mayikt.stream;

import com.mayikt.entity.Person;

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

/**
 * 1.參考博客:https://blog.csdn.net/liuerchong/article/details/120279530
 */
public class TestCollectorsToMap {

    public static void main(String[] args) {
        List<Person> persons = new ArrayList<>();
        persons.add(new Person("zhangsan", 15));
        persons.add(new Person("lisi", 20));
        persons.add(new Person("wangwu", 30));
        persons.add(new Person("wangmazi", 40));

        Map<String, Integer> personMap = persons.stream().collect(Collectors.toMap(Person::getName, Person::getAge));
        System.out.println(personMap);

        Map<String, Person> personMap2 = persons.stream().collect(Collectors.toMap(Person::getName, person -> person));
        System.out.println(personMap2);

        //當persons中有key重複時:會報錯:Duplicate key Person{name='lisi', age=20}
        persons.add(new Person("lisi", 21));
        try {
            Map<String, Person> personMap3 = persons.stream().collect(Collectors.toMap(Person::getName, person -> person));
        }catch (Exception e) {
            e.printStackTrace();
        }

        //重複的鍵中,取後者的值
        Map<String, Person> personMap4 = persons.stream().collect(Collectors.toMap(Person::getName, person -> person, (p1, p2) -> p2));
        System.out.println(personMap4);

        //你也可以把異常拋出來
        Map<String, Person> personMap5 = persons.stream().collect(Collectors.toMap(Person::getName, person -> person, (p1, p2) -> {
            throw new RuntimeException("存在相同的鍵:" + p1.getName());
        }));
        System.out.println(personMap5);
    }
}

console:

{lisi=20, zhangsan=15, wangwu=30, wangmazi=40}
{lisi=Person{name='lisi', age=20}, zhangsan=Person{name='zhangsan', age=15}, wangwu=Person{name='wangwu', age=30}, wangmazi=Person{name='wangmazi', age=40}}
{lisi=Person{name='lisi', age=21}, zhangsan=Person{name='zhangsan', age=15}, wangwu=Person{name='wangwu', age=30}, wangmazi=Person{name='wangmazi', age=40}}
java.lang.IllegalStateException: Duplicate key Person{name='lisi', age=20}
	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.mayikt.stream.TestCollectorsToMap.main(TestCollectorsToMap.java:31)
Exception in thread "main" java.lang.RuntimeException: 存在相同的鍵:lisi
	at com.mayikt.stream.TestCollectorsToMap.lambda$main$5(TestCollectorsToMap.java:42)
	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.mayikt.stream.TestCollectorsToMap.main(TestCollectorsToMap.java:41)

Process finished with exit code 1

 

 

 

 

 

 

 

 ----

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章