对一个list根据对象中属性转成map,存在重复数据时转成map报错
示例 简单实体类
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Tag {
private Integer id;
private String detail;
}
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public static class User {
private Integer id;
private String name;
private List<Tag> tagList;
public static void main(String[] args) {
List<Tag> tagList = new ArrayList<Tag>(){{
add(new Tag(1,"法外狂徒"));
add(new Tag(1,"好猛啊"));
add(new Tag(1,"真的有点猛"));
}};
ArrayList<User> users = new ArrayList<User>() {{
add(new User(1, "张三", tagList));
add(new User(2, "张三", tagList));
}};
Map<String, User> userMap = users.stream().distinct().collect(Collectors.toMap(User::getName, v -> v));
userMap.forEach((integer, user) -> System.out.println(user.toString()));
}
}
存在重复的key值将会报错
Exception in thread "main" java.lang.IllegalStateException: Duplicate key User(id=1, name=张三, tagList=[Tag(id=1, detail=法外狂徒), Tag(id=1, detail=好猛啊), Tag(id=1, detail=真的有点猛)])
at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
at java.util.HashMap.merge(HashMap.java:1254)
at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.util.stream.DistinctOps$1$2.accept(DistinctOps.java:175)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at com.zjt.cloud.domain.User.main(User.java:41)
使用 Function.identity() 取其中一个转成Map
public static void main(String[] args) {
List<Tag> tagList = new ArrayList<Tag>(){{
add(new Tag(1,"法外狂徒"));
add(new Tag(1,"好猛啊"));
add(new Tag(1,"真的有点猛"));
}};
ArrayList<User> users = new ArrayList<User>() {{
add(new User(1, "张三", tagList));
add(new User(2, "张三", tagList));
}};
// 转成Map时比较key值,存在一致的取其中一个
Map<String, User> userMap = users.stream().collect(Collectors.toMap(User::getName, Function.identity(), (key1, key2) -> key1));
userMap.forEach((integer, user) -> System.out.println(user.toString()));
}