使用stream流grouping by将list对象中三个条件依次分组
时间: 2024-05-11 12:14:50 浏览: 72
可以这样实现:
```
Map<String, Map<String, Map<String, List<Object>>>> groupedMap = list.stream()
.collect(Collectors.groupingBy(obj -> obj.getCondition1(),
Collectors.groupingBy(obj -> obj.getCondition2(),
Collectors.groupingBy(obj -> obj.getCondition3()))));
```
其中,`Condition1`、`Condition2`、`Condition3`分别表示三个条件。`groupedMap`是一个Map嵌套结构,可以通过三个条件依次进行分组。
相关问题
使用stream流grouping by 实现三个条件有序分组
非常好的问题!使用Stream流的groupingBy功能可以根据指定条件对元素进行分组,并返回一个Map。你可以使用多个groupingBy,使得分组结果有序。下面是一个示例代码:
```
Map<String, Map<String, List<String>>> result = list.stream()
.collect(Collectors.groupingBy(elem -> elem.substring(0, 1),
LinkedHashMap::new,
Collectors.groupingBy(elem -> elem.substring(1, 2),
LinkedHashMap::new,
Collectors.mapping(elem -> elem.substring(2), Collectors.toList()))));
```
这个代码将元素按照前两个字符进行分组,并且保证了分组结果的顺序。你可以根据自己的需求进行修改。希望能对你有所帮助!
stream流 groupingBy
在Java 8及以上版本中,你可以使用`Collectors.groupingBy()`方法将流按照指定的分类器(如Lambda表达式)分组。如果你希望对分组后的结果进行排序,可以在`groupingBy()`方法后面使用`Collectors.toMap()`方法,指定排序的方式。
例如,假设你有一个`Person`类,其中包含姓名和年龄属性,你希望按照年龄将这些人分组,并且对每个年龄分组内的人按照姓名进行排序。你可以这样实现:
```
List<Person> people = Arrays.asList(
new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 25),
new Person("David", 35)
);
Map<Integer, List<Person>> groupedPeople = people.stream()
.collect(Collectors.groupingBy(Person::getAge,
TreeMap::new, //使用TreeMap进行排序
Collectors.toList()));
groupedPeople.forEach((age, group) -> {
System.out.println("Age: " + age);
group.forEach(person -> System.out.println(" " + person.getName()));
});
```
在这个例子中,`groupingBy()`方法使用`Person::getAge`作为分类器,将人按照年龄分组。然后,`toMap()`方法指定了一个`TreeMap`作为排序方式,并将每个年龄分组内的人以列表形式进行收集。
最后,使用`forEach()`方法遍历分组后的结果,并打印出每个年龄分组以及该分组内的人的姓名。注意,由于使用了`TreeMap`进行排序,因此每个年龄分组内的人的姓名将按照字母顺序排列。
阅读全文