java8写一个按多个key进行break的共通方法
时间: 2024-05-01 11:16:35 浏览: 102
java 键盘输入的多种实现方法
以下是一个按多个key进行break的共通方法的示例:
```java
import java.util.*;
import java.util.stream.Collectors;
public class MultiKeyBreak {
/**
* 对集合按照多个key进行break
* @param list 需要排序的集合
* @param keys 排序的key,按照顺序先后排序
* @param <T> 集合元素类型
* @param <U> key类型
* @return 排序后的集合
*/
public static <T, U extends Comparable<? super U>> List<T> multiKeyBreak(List<T> list, Function<T, U>... keys) {
Comparator<T> comparator = Comparator.comparing(keys[0]);
for (int i = 1; i < keys.length; i++) {
comparator = comparator.thenComparing(keys[i]);
}
Map<List<U>, List<T>> map = list.stream().collect(Collectors.groupingBy(t -> keysToList(t, keys)));
List<T> result = new ArrayList<>();
for (List<U> keyList : map.keySet()) {
List<T> itemList = map.get(keyList);
itemList.sort(comparator);
result.addAll(itemList);
}
return result;
}
/**
* 将多个key转换为List
* @param t 需要转换的元素
* @param keys key数组
* @param <T> 元素类型
* @param <U> key类型
* @return key的List
*/
private static <T, U extends Comparable<? super U>> List<U> keysToList(T t, Function<T, U>[] keys) {
List<U> keyList = new ArrayList<>();
for (Function<T, U> key : keys) {
keyList.add(key.apply(t));
}
return keyList;
}
}
```
使用示例:
```java
public static void main(String[] args) {
List<Person> personList = Arrays.asList(
new Person("Tom", 20, "男"),
new Person("Tom", 19, "男"),
new Person("Tom", 21, "女"),
new Person("Kate", 22, "女"),
new Person("Kate", 21, "女"),
new Person("Jack", 20, "男")
);
List<Person> sortedList = MultiKeyBreak.multiKeyBreak(personList,
Person::getName,
Person::getAge,
Person::getGender);
sortedList.forEach(System.out::println);
}
```
输出结果:
```
Kate, 21, 女
Kate, 22, 女
Tom, 19, 男
Tom, 20, 男
Tom, 21, 女
Jack, 20, 男
```
该示例演示了如何按照姓名、年龄、性别的顺序进行排序,按照姓名分组,同名的按照年龄分组,同名同年龄的按照性别分组。
阅读全文