[实践总结] Java8 List结果集 分组为 Map结果集

1、按对象属性分组

------------------------------------------------------------------------------------------------------------
# List<Dog> → Map<name, List<Dog>>
------------------------------------------------------------------------------------------------------------
# 方法1
Map<String, List<Dog>> collect1 = list.stream().collect(Collectors.groupingBy(Dog::getName));
// list为empty    →  {}
// list为null     →  NPE
// model存在null  →  NPE
// key存在null    →  NPE
// {Tom=[Dog(name=Tom, age=18), Dog(name=Tom, age=19)], John=[Dog(name=John, age=18)]}

# 综上 最安全方式
Map<String, List<Dog>> collect1 = list.stream().filter(a -> a != null && a.getName() != null).collect(Collectors.groupingBy(Dog::getName));
//{Tom=[Dog(name=Tom, age=18), Dog(name=Tom, age=19)], John=[Dog(name=John, age=18)]}

------------------------------------------------------------------------------------------------------------
# 方法2
Map<String, List<Dog>> collect2 = list.stream().collect(Collectors.groupingBy(Dog::getName, HashMap::new, Collectors.toList()));
// list为empty    →  {}
// list为null     →  NPE
// model存在null  →  NPE
// key存在null    →  NPE
// {Tom=[Dog(name=Tom, age=18), Dog(name=Tom, age=19)], John=[Dog(name=John, age=18)]}

# 综上 最安全方式
Map<String, List<Dog>> collect2 = list.stream().filter(a -> a != null && a.getName() != null).collect(Collectors.groupingBy(Dog::getName, HashMap::new, Collectors.toList()));
// {Tom=[Dog(name=Tom, age=18), Dog(name=Tom, age=19)], John=[Dog(name=John, age=18)]}

------------------------------------------------------------------------------------------------------------
# 方法3
Map<String, List<Dog>> collect3 = list.stream().collect(Collectors.groupingBy(Dog::getName, Collectors.mapping(Function.identity(), Collectors.toList())));
// list为empty    →  {}
// list为null     →  NPE
// model存在null  →  NPE
// key存在null    →  NPE
// {Tom=[Dog(name=Tom, age=18), Dog(name=Tom, age=19)], John=[Dog(name=John, age=18)]}

# 综上 最安全方式
Map<String, List<Dog>> collect3 = list.stream().filter(a -> a != null && a.getName() != null).collect(Collectors.groupingBy(Dog::getName, Collectors.mapping(Function.identity(), Collectors.toList())));
// {Tom=[Dog(name=Tom, age=18), Dog(name=Tom, age=19)], John=[Dog(name=John, age=18)]}

------------------------------------------------------------------------------------------------------------
# List<Dog> → Map<name, List<Age>>
------------------------------------------------------------------------------------------------------------
Map<String, List<Integer>> res = list.stream().collect(Collectors.groupingBy(Dog::getName, Collectors.mapping(Dog::getAge, Collectors.toList())));
// list为empty          →  {}
// list为null           →  NPE
// model存在null        →  NPE
// key存在null          →  NPE
// value为null依旧收集   →  {Tom=[18, 18], John=[18, null]}
// value重复收集不去重   →  {Tom=[18, 18], John=[18, null]}

# 综上 最安全方式
Map<String, List<Integer>> collect4 = list.stream().filter(a -> a != null && a.getName() != null).collect(Collectors.groupingBy(Dog::getName, Collectors.mapping(Dog::getAge, Collectors.toList())));
// {Tom=[18, 18], John=[18, null]}

2、按对象属性映射

------------------------------------------------------------------------------------------------------------
# List<Dog> → Map<name, Dog>
------------------------------------------------------------------------------------------------------------
Map<String, Dog> res = list.stream().collect(Collectors.toMap(Dog::getName, Function.identity()));
// list为empty            →  {}
// list为null             →  NPE
// model存在null          →  NPE
// key为null则null作为key  →  {null=Dog(name=null, age=20), Tom=Dog(name=Tom, age=18)}
#  Key重复报错(包括null)   →  IllegalStateException: Duplicate key
#  Key重复时覆盖
Map<String, Dog> collect8 = list.stream().collect(Collectors.toMap(Dog::getName, Function.identity(), (existing, replacement) -> replacement));
// Key重复时覆盖(e1, e2) -> e2      →  {null=Dog(name=null, age=21), Tom=Dog(name=Tom, age=22), John=Dog(name=John, age=18)}
#  Key重复时丢弃
Map<String, Dog> collect9 = list.stream().collect(Collectors.toMap(Dog::getName, Function.identity(), (existing, replacement) -> existing));
// Key重复时丢弃(e1, e2) -> e1      →  {null=Dog(name=null, age=20), Tom=Dog(name=Tom, age=18), John=Dog(name=John, age=18)}

------------------------------------------------------------------------------------------------------------
# List<Dog> → Map<name, age>
------------------------------------------------------------------------------------------------------------
# 方式1
Map<String, Integer> res = list.stream().collect(Collectors.toMap(Dog::getName, Dog::getAge));
// list为empty            →  {}
// list为null             →  NPE
// model存在null          →  NPE
// key为null则null作为key  →  {null=20, John=18}
# value为null            →  NPE
# Key重复报错             →  IllegalStateException: Duplicate key
# Key重复时覆盖
Map<String, Integer> collect9 = list.stream().collect(Collectors.toMap(Dog::getName, Dog::getAge, (existing, replacement) -> replacement));
// Key重复时覆盖(e1, e2) -> e2      →  {Tom=23, John=22}
# Key重复时丢弃
Map<String, Integer> collect9 = list.stream().collect(Collectors.toMap(Dog::getName, Dog::getAge, (existing, replacement) -> existing));
// Key重复时丢弃(e1, e2) -> e1      →  {Tom=22, John=22}

# 综上 最安全方式
Map<String, Integer> res = list.stream().filter(a -> a != null && a.getAge() != null).collect(Collectors.toMap(Dog::getName, Dog::getAge, (existing, replacement) -> replacement));
// {null=22, Tom=23, John=22}

------------------------------------------------------------------------------------------------------------
# 方式2
Map<String, Integer> res = list.stream().collect(HashMap::new, (map1, per) -> map1.put(per.getName(), per.getAge()), HashMap::putAll);
// list为empty                     →  {}
// list为null                      →  NPE
// model存在null                   →  NPE
// key为null则null作为key           →  {null=20, John=18}
// value存在null则null作为value     →  {Tom=18, John=null}
// Key重复时value被后面的值替换      →  {Tom=22}

[代码总结] 获取字符串→字符串长度的Map

List<String> list = Arrays.asList("a1", "ae2", "b1bb", "cq2", "c1fgfv");
Map<String, Integer> map = list.stream().collect(Collectors.toMap(str -> str, str -> str.length()));
Map<String, Integer> map = list.stream().collect(Collectors.toMap(Function.identity(), String::length));
// {a1=2, b1bb=4, cq2=3, c1fgfv=6, ae2=3}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 8中的Stream流可以使用groupingBy()方法将List分组换为Map。具体步骤如下: 1. 首先,使用Stream流将List换为Map,其中键为分组的依据,值为分组的元素列表。 2. 然后,使用Collectors.groupingBy()方法将Map按照键进行分组。 3. 最后,将分组后的Map换为需要的格式。 示例代码如下: ``` List<Person> persons = Arrays.asList( new Person("John", 20), new Person("Mary", 25), new Person("Tom", 30), new Person("Jerry", 20) ); Map<Integer, List<Person>> groupByAge = persons.stream() .collect(Collectors.groupingBy(Person::getAge)); Map<Integer, List<String>> result = new HashMap<>(); groupByAge.forEach((age, list) -> { List<String> names = list.stream() .map(Person::getName) .collect(Collectors.toList()); result.put(age, names); }); System.out.println(result); ``` 输出结果为: ``` {25=[Mary], 20=[John, Jerry], 30=[Tom]} ``` 其中,Person类的定义如下: ``` 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; } } ``` ### 回答2: Java8Stream流提供了大量的操作功能,其中包括对列表(List)进行分组操作并将分组结果换为Map的功能。这个操作可以让开发者更加方便地进行数据处理和统计。 Java8中的Stream流提供的groupingBy方法是用于对列表进行分组的,它是一个Collector接口的实现,可以将中间操作结果进行收,并将其换为指定类型的数据结构。groupingBy方法中的参数是一个Function,用于根据某个属性对列表进行分组,例如: ``` List<User> userList = Arrays.asList( new User(1, "张三", 20), new User(2, "李四", 21), new User(3, "王五", 21), new User(4, "赵六", 22)); Map<Integer, List<User>> ageMap = userList.stream().collect(Collectors.groupingBy(User::getAge)); ``` 在这个例子中,我们根据User对象的age属性进行分组操作,并将分组结果换为Map<Integer, List<User>>类型的数据结构。其中,User::getAge是一个Function,表示根据User对象的age属性进行分组。 除了直接对属性进行分组外,我们还可以对属性进行二次操作,例如: ``` Map<Integer, List<String>> nameMap = userList.stream().collect(Collectors.groupingBy(User::getAge, Collectors.mapping(User::getName, Collectors.toList()))); ``` 这个例子中,我们对User对象的name属性进行分组,并将分组结果换为Map<Integer, List<String>>类型的数据结构。其中,除了使用User::getAge进行分组外,我们还使用了Collectors.mapping方法和Collectors.toList方法对属性进行操作,将分组结果换为List<String>类型。 通过以上例子,我们可以看到,在Java8中,通过使用Stream流和Collector接口的实现,我们可以非常方便地对列表进行分组操作,将分组结果换为我们需要的类型的数据结构。这样的操作可以帮助我们更加高效地进行数据统计和分析。 ### 回答3: Java8引入了Stream API,它的出现大大简化了合的操作。Stream API提供了满足各种需求的链式操作,其中一个常用的操作是将List分组Map。 我们可以使用流的Collectors.groupingBy()方法将List中的对象按照某个属性分组,然后使用Collectors.toMap()方法将分组结果化为一个Map对象。下面是一段示例代码: ``` import java.util.*; import java.util.stream.Collectors; public class GroupByTest { public static void main(String[] args) { // 初始化List List<Person> persons = new ArrayList<>(); persons.add(new Person("张三", "男", 20)); persons.add(new Person("李四", "男", 25)); persons.add(new Person("王五", "女", 21)); persons.add(new Person("赵六", "女", 24)); // 分组Map Map<String, List<Person>> groups = persons.stream().collect(Collectors.groupingBy(Person::getGender)); groups.forEach((key, value) -> System.out.println(key + " : " + value)); } } class Person { private String name; private String gender; private int age; public Person(String name, String gender, int age) { this.name = name; this.gender = gender; this.age = age; } // 省略get/set方法 // ... } ``` 在上面的代码中,我们定义了一个Person类,然后初始化了一个Person合,其中每个Person对象都有name、gender、age三个属性。之后我们使用了Stream API的groupingBy()方法按照gender属性进行分组,然后使用forEach打印出了分组结果。运行上面的代码可以得到如下输出: ``` 女 : [Person{name='王五', gender='女', age=21}, Person{name='赵六', gender='女', age=24}] 男 : [Person{name='张三', gender='男', age=20}, Person{name='李四', gender='男', age=25}] ``` 可以看到,我们成功使用Stream API将List合按照gender属性进行了分组,并将分组结果化为Map合。这是Stream API中非常常用的一个操作,开发者可以根据自己的需求灵活运用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值