Collectors.mapping()
Java 8
流的新类java.util.stream.Collectors
实现了java.util.stream.Collector
接口,同时又提供了大量的方法对流 (stream
) 的元素执行map
and
reduce
操作,或者统计操作。
Collectors.mapping()
一般用于多重 map and reduce
中。 Java
文档中描述的原型如下
//第一个参数用于 map ,第二个参数用于 reduce
mapping(Function<? super T,? extends U> mapper, Collector<? super U,A,R> downstream)
作用:
- 流式操作可进行很多的操作
- 过滤
fliter
- 运算
map
- 去重
distinct
- ……
- 过滤
- 经过N多的运算、筛选、排序、操作……返回我们需要的集合
mappingExample代码
首先一个创建Bean
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;
}
}
简单测试使用mapping
@Test
public void mappingExample() {
List<Person> list = new ArrayList<>();
list.add(new Person("Ram", 30));
list.add(new Person("Shyam", 20));
list.add(new Person("Shiv", 20));
list.add(new Person("Mahesh", 30));
String nameByAge = list.stream().collect(Collectors.mapping(Person::getName, Collectors.joining(",", "[", "]")));
System.out.println(nameByAge);
nameByAge = list.stream().map(person -> person.getName()).collect(Collectors.joining(",", "[", "]"));
System.out.println(nameByAge);
}
/*
运行结果:
[Ram,Shyam,Shiv,Mahesh]
[Ram,Shyam,Shiv,Mahesh]
可以发现达到相同的效果
*/
使用Collectors.groupingBy
方法进行分组
@Test
public void mappingExample() {
List<Person> list = new ArrayList<>();
list.add(new Person("Ram", 30));
list.add(new Person("Shyam", 20));
list.add(new Person("Shiv", 20));
list.add(new Person("Mahesh", 30));
Map<Integer, String> nameByAgeMap = list.stream().collect(
Collectors.groupingBy(Person::getAge, Collectors.mapping(Person::getName, Collectors.joining(",", "[", "]"))));
nameByAgeMap.forEach((k, v) -> System.out.println("Age:" + k + " Persons: " + v));
}
/*
运行结果:
Age:20 Persons: [Shyam,Shiv]
Age:30 Persons: [Ram,Mahesh]
封装为Map后返回
*/