2022年5月6日 Java8 API Collectors.toMap()
在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值。