list groupby java_Java 8 GroupBy一个字段然后映射到多个字段

您还可以尝试将作为下游函数传递的自定义收集器定义到Collectors.groupingBy().考虑以下示例:

import java.util.Arrays;

import java.util.Collection;

import java.util.HashMap;

import java.util.HashSet;

import java.util.List;

import java.util.Map;

import java.util.Set;

import java.util.stream.Collector;

import java.util.stream.Collectors;

public class PersonGroupByExample {

public static void main(String[] args) {

final List> input = Arrays.asList(

new HashMap(){{

put("userId","user1");

put("firstName","John");

put("lastName","Smith");

put("courses","course1");

}},new HashMap

}},"course3");

}},"user2");

put("firstName","Jack");

put("lastName","course2");

}}

);

final Collection result = input.stream()

.parallel()

.collect(Collectors.groupingBy(it -> it.get("userId"),Collector.of(

// Start with an empty Person object

Person::new,// Collect a list of map objects grouped by the same userId into a single Person object

(person,map) -> {

// Override common properties

person.setUserId(map.getOrDefault("userId","").toString());

person.setFirstName(map.getOrDefault("firstName","").toString());

person.setLastName(map.getOrDefault("lastName","").toString());

// Add person's course to a courses set

person.getCourses().add(new Course(map.getOrDefault("courses","").toString()));

},// Combiner function that join partials results (for parallel execution)

(person,person2) -> {

person.getCourses().addAll(person2.getCourses());

return person;

}

))).values();

result.forEach(System.out::println);

}

static class Person {

String userId;

String firstName;

String lastName;

Set courses = new HashSet<>();

public Person() {}

public String getUserId() {

return userId;

}

public void setUserId(String userId) {

this.userId = userId;

}

public String getFirstName() {

return firstName;

}

public void setFirstName(String firstName) {

this.firstName = firstName;

}

public String getLastName() {

return lastName;

}

public void setLastName(String lastName) {

this.lastName = lastName;

}

public Set getCourses() {

return courses;

}

public void setCourses(Set courses) {

this.courses = courses;

}

@Override

public String toString() {

return "Person{" +

"userId='" + userId + '\'' +

",firstName='" + firstName + '\'' +

",lastName='" + lastName + '\'' +

",courses=" + courses +

'}';

}

}

static class Course {

String id;

public Course(String id) {

this.id = id;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

@Override

public String toString() {

return "Course{" +

"id='" + id + '\'' +

'}';

}

}

}

Collectors.groupingBy()按userId字段对所有条目进行分组,然后使用自定义收集器的下游函数减少Map< String,Object>的列表.由同一userId分组的条目包含所有课程的单个Person实例.我使用Person和Course POJO来说明流程,也输入List< Map< String,Object>>用于说明转换过程.

最后,我们调用Map.values()方法返回Collection< Person>而不是Map< String,Person>.

运行此示例将创建以下输出:

Person{userId='user1',firstName='John',lastName='Smith',courses=[Course{id='course1'},Course{id='course3'},Course{id='course2'}]}

Person{userId='user2',firstName='Jack',courses=[Course{id='course2'},Course{id='course1'}]}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值