ava8写一个以多个字段作为key进行break的共通方法
时间: 2024-06-12 21:08:19 浏览: 136
Java8 stream 中利用 groupingBy 进行多字段分组求和案例
5星 · 资源好评率100%
一个通用的以多个字段作为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中。
阅读全文