编程中多数要对集合进行各种操作,获取Map、Set、List等。
Map
比如一个对象List,获取所有人的名字集合
@Test
public void should_can_get_name_map() {
PersonInfo kaka = new PersonInfo("Kaka", 22);
PersonInfo hustzw = new PersonInfo("Hustzw", 24);
List<PersonInfo> personInfos = Lists.newArrayList(kaka, hustzw);
List<String> nameList = personInfos.stream().map(PersonInfo::getName).collect(Collectors.toList());
assertThat(nameList).contains("Kaka");
}
HashMap
构建一个属性和其本身的映射,比如根据人名找到人。
@Test
public void should_can_get_name_info_map() {
PersonInfo kaka = new PersonInfo("Kaka", 22);
PersonInfo hustzw = new PersonInfo("Hustzw", 24);
List<PersonInfo> personInfos = Lists.newArrayList(kaka, hustzw);
// 注意, 这里 key 不能重复,否则报错
Map<String, PersonInfo> nameInfoMap1 = personInfos.stream().collect(Collectors.toMap(PersonInfo::getName, x -> x));
Map<String, PersonInfo> nameInfoMap2 = personInfos.stream().collect(Collectors.toMap(PersonInfo::getName, Function.identity()));// 效果一样
assertThat(nameInfoMap1).containsKeys("Kaka", "Hustzw");
assertThat(nameInfoMap2).containsKeys("Kaka", "Hustzw");
}
Set
同样是获取集合
@Test
public void should_can_get_set() {
PersonInfo kaka = new PersonInfo("Kaka", 22);
PersonInfo hustzw = new PersonInfo("Hustzw", 24);
List<PersonInfo> personInfos = Lists.newArrayList(kaka, hustzw);
// 注意, 这里 key 不能重复,否则报错
Set<PersonInfo> adultsSet = personInfos.stream().filter(x -> x.getAge() >= 18).collect(Collectors.toSet());
assertThat(adultsSet).contains(kaka, hustzw);
assertThat(adultsSet).contains(hustzw, kaka);
}
flatmap
Java8的stream中提供flatmap也是用于构建Map,不过区别的是它会把结果打平。看个例子:
有两个List,想对所有元素按年龄分类。如果利用循环可能需要两层循环。
利用 flatemap后,打平后很容易对其操作。