java Collectors.groupingBy 自定义条件
时间: 2023-07-07 16:44:49 浏览: 111
如果你想使用Java 8中的Collectors.groupingBy方法来根据自定义条件对一个数据集进行分组,你可以使用Collectors.groupingBy方法的重载版本,该版本接受一个Function参数,该Function参数将每个元素映射到一个自定义分组键。例如,假设你有一个Person类的列表,你想根据Person对象的年龄分组,但只想分成两组:18岁及以下和19岁及以上。你可以这样做:
```
Map<String, List<Person>> groups = persons.stream()
.collect(Collectors.groupingBy(
person -> person.getAge() <= 18 ? "18 and under" : "19 and over"));
```
在这个例子中,我们使用了一个lambda表达式将Person对象映射到一个字符串,该字符串指示该对象属于哪个分组。最终,我们得到了一个Map对象,其中键是分组名称,值是一个Person对象列表。
相关问题
Collectors.groupingBy自定义key
可以使用`Collectors.groupingBy`方法进行按照自定义的key进行分组。这个方法接受一个Function作为参数,用于生成分组的key。下面是一个示例代码:
```java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eve");
Map<Character, List<String>> groups = names.stream()
.collect(Collectors.groupingBy(name -> name.charAt(0)));
System.out.println(groups);
```
输出结果如下:
```
{A=[Alice], B=[Bob], C=[Charlie], D=[David], E=[Eve]}
```
在这个示例中,我们通过`name.charAt(0)`来生成以名字首字母为key的分组。
collect(Collectors.groupingBy 自定义分组
collect(Collectors.groupingBy)是Java 8中Stream API提供的一个用于分组的方法。它可以根据指定的条件将流中的元素进行分组,并返回一个Map对象,其中键是分组的条件,值是对应的元素列表。
自定义分组可以通过传递一个自定义的分类函数来实现。这个分类函数接受流中的每个元素作为输入,并返回一个用于分组的键。下面是使用collect(Collectors.groupingBy)进行自定义分组的示例代码:
```java
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> fruits = Arrays.asList("apple", "banana", "orange", "grape", "watermelon");
// 自定义分组,按照水果名称的长度进行分组
Map<Integer, List<String>> groups = fruits.stream()
.collect(Collectors.groupingBy(String::length));
// 输出分组结果
for (Map.Entry<Integer, List<String>> entry : groups.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Values: " + entry.getValue());
}
}
}
```
运行以上代码,输出结果如下:
```
Key: 5, Values: [apple]
Key: 6, Values: [banana, orange, grape]
Key: 10, Values: [watermelon]
```
以上代码中,我们使用了String::length作为分类函数,将水果按照名称长度进行了分组。最终得到了一个Map对象,其中键是水果名称的长度,值是对应长度的水果列表。
阅读全文