«

2022年5月6日 Java8 API Collectors.toMap()

Mahalalel 发布于 阅读:2200 JavaAPI


在review大佬写的代码时,遇见了一个Stream()流的用法,不甚了解,故此记录下
listByRooms.stream().collect(Collectors.toMap(HrRoomListing::getRoomId, i -> i, (a, b) -> a));

Collectors.toMap()用法:列表List转为Map

解析:
1、HrRoomListing::getRoomId:选择HrRoomListing对象中的roomId作为Map对象的key;

2、i -> i:将原来列表中的roomId对应的HrRoomListing对象,作为 key 对应的 value 的值;

3、(a, b) -> a:当roomId作为key重复时,取第一个key和value作为最终的数据,忽略了重复的数据。

demo如下
Person.java

public class Person {
    String name;
    int age;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Person{");
        sb.append("name='").append(name).append('\'');
        sb.append(", age=").append(age);
        sb.append('}');
        return sb.toString();
    }
}

测试类:

@SpringBootTest
class JavaStreamDemoApplicationTests {
    @Test
    void testStream() {

        Person p1 = new Person("James", 20);
        Person p2 = new Person("John", 20);
        Person p3 = new Person("Curry", 23);
        Person p4 = new Person("John", 25);

        List<Person> pList = Arrays.asList(p1, p2, p3, p4);
        Map<String, Person> personMap = pList.stream().collect(Collectors.toMap(Person::getName, i -> i, (a, b) -> a));

        personMap.keySet().forEach(i -> {
            System.out.println("key = " + i + ", value = " + personMap.get(i)+";");
        });
    }
}

最终的输出结果如下:

key = Curry, value = Person{name='Curry', age=23};
key = James, value = Person{name='James', age=20};
key = John, value = Person{name='John', age=20};

我们可以看到,有两个name为"john"的对象,写入map中,重复的key只保存了第一个Person对象。

注:你也可以使用(a, b) -> b,这样的话,就是出现重复的key时,使用第二个对象作为key对应的value值。

Java8 Stream操作 List转Map