有一个List<Student>,Student对象有String类型的class、id字段。请用 一行java8的 stream方法,返回一个Map<String,Set<String>>,按class分组,收集id字段
时间: 2024-06-01 19:13:55 浏览: 18
答:
可以这样写:
Map<String, Set<String>> result = students.stream()
.collect(Collectors.groupingBy(Student::getClass,
Collectors.mapping(Student::getId, Collectors.toSet())));
其中students是一个包含Student对象的List。以上代码使用了Java 8的stream()和Collector API,以class字段为key,将Student对象分组并收集id字段,最后返回一个Map<String, Set<String>>。
相关问题
java给一个对象list,根据某个字段进行分组
可以使用Java 8的Stream API来实现根据某个字段进行分组,例如按照学生的年级进行分组:
假设有一个Student类,其中包含name、grade等属性,代码如下:
```
public class Student {
private String name;
private int grade;
public Student(String name, int grade) {
this.name = name;
this.grade = grade;
}
public String getName() {
return name;
}
public int getGrade() {
return grade;
}
}
```
现在有一个Student列表students,我们要根据grade进行分组,代码如下:
```
Map<Integer, List<Student>> studentMap = students.stream().collect(Collectors.groupingBy(Student::getGrade));
```
这段代码使用了Stream的groupingBy方法,将学生按照年级进行分组,返回的是一个Map<Integer, List<Student>>类型,其中key为年级,value为该年级的学生列表。
ava8写一个以多个字段作为key进行break的共通方法
一个通用的以多个字段作为key进行break的方法可以使用Java的Stream API和Lambda表达式,实现方法如下:
```java
public static <T, K> Map<K, List<T>> groupBy(List<T> list, Function<T, K[]> keyExtractor) {
return list.stream().collect(Collectors.groupingBy(
t -> Arrays.asList(keyExtractor.apply(t)),
LinkedHashMap::new,
Collectors.toList()
));
}
```
该方法需要传入一个泛型的List和一个Function,其中Function用于从泛型对象中提取多个字段作为key,返回一个K数组。使用Stream API的collect方法,将List中的对象按照key进行分组,返回一个Map,Map的key是K类型,value是一个List,List中存放的是符合该key的对象。使用LinkedHashMap来保证分组后的顺序与原List中的顺序一致。
例如,如果有一个Student类,其中有id和name两个字段,需要按照id和name进行分组,可以这样调用:
```java
List<Student> students = Arrays.asList(
new Student(1, "Tom"),
new Student(2, "Jerry"),
new Student(1, "John"),
new Student(3, "Bob"),
new Student(1, "Mary")
);
Map<List<Object>, List<Student>> result = groupBy(students, s -> new Object[]{s.getId(), s.getName()});
```
其中,Student类的定义如下:
```java
public class Student {
private int id;
private String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
```
执行完成后,result的内容如下:
```
{
[1, Tom]=[Student{id=1, name='Tom'}, Student{id=1, name='John'}, Student{id=1, name='Mary'}],
[2, Jerry]=[Student{id=2, name='Jerry'}],
[3, Bob]=[Student{id=3, name='Bob'}]
}
```
可以看到,按照id和name进行分组后,id和name相同的Student对象被放到了同一个List中。
相关推荐
![text/x-c++](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)