java8的stream将一个List转为按照某个字段分组的map,(Map
然后再按照 更新日期
字段取分组的每个list里最大的那个,Map
最终得到一个map
List---> (Map >) ----> Map
1. Owner对象结构
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Owner implements Serializable {
/**
* 成员名称
*/
private String name;
/**
* 身份证号
*/
private String idcard;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
}
2. 处理过程
@Test
void testList() throws ParseException {
List list = new ArrayList<>();
// 取得字符串表示的Date对象
Date d1 = DateUtils.toDate("1662-05-04 22:22:22");
Date d2 = DateUtils.toDate("0599-01-23 00:00:00");
Date d3 = DateUtils.toDate("1328-10-21 11:11:11");
Owner o1 = Owner.builder().idcard("1001").updateTime(d1).name("康熙").build();
Owner o2 = Owner.builder().idcard("1001").updateTime(d2).name("李世民").build();
Owner o3 = Owner.builder().idcard("1001").updateTime(d3).name("朱元璋").build();
Owner o4 = Owner.builder().idcard("1002").updateTime(d1).name("张三").build();
Owner o5 = Owner.builder().idcard("1003").updateTime(d1).name("李四").build();
list.add(o1);
list.add(o2);
list.add(o3);
list.add(o4);
list.add(o5);
// 将List按照Owner对象的 idcard 字段分组 得到map
Map> listMap = list.stream().collect(Collectors.groupingBy(Owner::getIdcard));
// java8 Stream max函数使用的比较器:按照updateTime字段比较
Comparator comparator = Comparator.comparing(Owner::getUpdateTime);
// Map转换,取得每个idcard的最后更新的对象(多取一)
Map resultMap = new HashMap<>();
listMap.entrySet().stream().forEach(e-> {
Owner owner = e.getValue().stream().max(comparator).get();
resultMap.put(e.getKey(), owner);
});
// 最终得到 每个idcard一个对象的map
System.out.println(GsonUtils.toGson(resultMap));
3. 最终结果:
{
"1003":{
"name":"李四",
"idcard":"1003",
"updateTime":"1662-05-04 22:22:22"
},
"1002":{
"name":"张三",
"idcard":"1002",
"updateTime":"1662-05-04 22:22:22"
},
"1001":{
"name":"康熙",
"idcard":"1001",
"updateTime":"1662-05-04 22:22:22"
}
}