概述
定义一个实体类Student
@Data
@AllArgsConstructor
public class Student {
private int age;
private String name;
}
定义一个list
List<Student> list = new ArrayList<>();
list.add(new Student(12,"a"));
list.add(new Student(13,"b"));
list.add(new Student(12,"c"));
list 转 map
Map<String, Student> map= list.stream().collect(Collectors.toMap(new Function<Student, String>() {
@Override
public String apply(Student student) {
// 返回值为map key
return student.getName();
}
}, new Function<Student, Student>() {
@Override
public Student apply(Student student) {
// 返回值为map value
return student;
}
}));
lamda 写法
Map<String, Student> collect = list.stream().
collect(Collectors.toMap(Student::getName, student -> student));
结果
{a=Student(age=12, name=a), b=Student(age=13, name=b), c=Student(age=12, name=c)}
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 时使用
当key 有想相同的时候 需要使用第二个重载方法
Map<String, Student> collect = list.stream().collect(Collectors.toMap(Student::getName, student -> student,
new BinaryOperator<Student>() {
@Override
public Student apply(Student t, Student t2) {
//处理需要返回的数据
return t;
}
}));
第四个参数(mapSupplier)用于自定义返回 Map 类型,比如我们希望返回的 Map 是根据 Key 排序的,可以使用如下写法:
TreeMap<String, Student> collect = list.stream().
collect(Collectors.toMap(Student::getName,
student -> student,
(t, t2) -> t,
(Supplier<TreeMap<String, Student>>) TreeMap::new));
参考Java8 中 List 转 Map(Collectors.toMap) 使用技巧
List里面的对象元素,以某个属性来分组
以年龄分组
Map<Integer, List<Student>> collect1 = list.stream().
collect(Collectors.groupingBy(new Function<Student, Integer>() {
@Override
public Integer apply(Student student) {
//处理逻辑
return student.getAge();
}
}));
结果
{12=[Student(age=12, name=a), Student(age=12, name=c)], 13=[Student(age=13, name=b)]}
获取list 里对象处理之后组成新的list
List<String> collect = list.stream().
map(Student::getName).collect(Collectors.toList());
结果
[a, c, b]
List<Student> collect = list.stream().
peek(student -> student.setName("姓名"+student.getName())).collect(Collectors.toList());
结果
[Student(age=12, name=姓名a), Student(age=12, name=姓名c), Student(age=13, name=姓名b)]
最后
以上就是靓丽网络为你收集整理的java collectors的全部内容,希望文章能够帮你解决java collectors所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复