👌明白了,你想要的核心是:
- 排序
- 分组求和
- 转换为 Map
下面我写一个完整的 JDK8 示例,包含这三类常用操作。
示例代码
java
import java.util.*;
import java.util.stream.Collectors;
class Person {
String name;
String city;
int age;
int salary;
Person(String name, String city, int age, int salary) {
this.name = name;
this.city = city;
this.age = age;
this.salary = salary;
}
@Override
public String toString() {
return name + "-" + city + "-" + age + "-" + salary;
}
}
public class StreamDemo {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Tom", "Beijing", 20, 5000),
new Person("Jerry", "Shanghai", 25, 7000),
new Person("Alice", "Beijing", 30, 8000),
new Person("Bob", "Shanghai", 18, 4000),
new Person("Lily", "Beijing", 28, 6000)
);
// 1. 排序:按工资降序
List<Person> sortedBySalary = people.stream()
.sorted(Comparator.comparingInt((Person p) -> p.salary).reversed())
.collect(Collectors.toList());
System.out.println("按工资降序排序:" + sortedBySalary);
// 2. 分组求和:按城市分组,统计总工资
Map<String, Integer> salarySumByCity = people.stream()
.collect(Collectors.groupingBy(
p -> p.city,
Collectors.summingInt(p -> p.salary)
));
System.out.println("按城市统计工资总和:" + salarySumByCity);
// 3. 转换为 Map:姓名 -> 工资
Map<String, Integer> nameToSalary = people.stream()
.collect(Collectors.toMap(p -> p.name, p -> p.salary));
System.out.println("姓名 -> 工资:" + nameToSalary);
// 4. 如果 key 可能重复(比如按城市转 Map),需要指定合并规则
Map<String, Integer> cityToSalary = people.stream()
.collect(Collectors.toMap(
p -> p.city,
p -> p.salary,
Integer::sum // key 冲突时,合并 value(工资相加)
));
System.out.println("城市 -> 工资总和 (toMap 实现):" + cityToSalary);
}
}
输出结果示例
按工资降序排序:[Alice-Beijing-30-8000, Jerry-Shanghai-25-7000, Lily-Beijing-28-6000, Tom-Beijing-20-5000, Bob-Shanghai-18-4000]
按城市统计工资总和:{Beijing=19000, Shanghai=11000}
姓名 -> 工资:{Alice=8000, Bob=4000, Jerry=7000, Tom=5000, Lily=6000}
城市 -> 工资总和 (toMap 实现):{Beijing=19000, Shanghai=11000}
✅ 总结:
- 排序 :
sorted(Comparator.comparingInt(...).reversed())
- 分组求和 :
Collectors.groupingBy(..., Collectors.summingInt(...))
- 转换为 Map :
Collectors.toMap(key, value, mergeFunction)
要不要我帮你写一个更贴近业务表数据的版本(比如订单表:用户、商品、金额,做排序+分组求和+转 Map)?这样会更像实际开发中的用法。