Java7环境下RxJava实现Student按邮政编码分组统计的方法问询
实现按邮政编码分组并统计学生数量(Java7环境)
在Java7环境下没法用Lambda表达式,所以得靠RxJava 1.x的匿名内部类来实现所有函数式接口(RxJava 2.x要求Java8及以上,不兼容Java7),下面是完整的分组统计方案:
核心思路
- 用
groupBy操作符按学生的邮政编码拆分原始Observable,得到按邮编分组的GroupedObservable - 对每个分组调用
count()统计学生数量 - 将分组的邮编(key)和统计数组合成键值对,方便后续处理
完整代码示例
假设你的Student类有getPostalCode()方法获取邮编,代码如下:
import rx.Observable; import rx.functions.Func1; import java.util.AbstractMap; import java.util.Map; import java.util.List; import java.util.ArrayList; public class StudentPostalGrouping { public static void main(String[] args) { // 原始Observable:从学生列表转换而来 Observable<Student> source = Observable.fromIterable(getStudentList()); // 执行分组统计逻辑 Observable<Map.Entry<String, Long>> postalCodeCount = source // 按邮政编码分组,key为邮编字符串 .groupBy(new Func1<Student, String>() { @Override public String call(Student student) { return student.getPostalCode(); } }) // 遍历每个分组,统计数量并组合键值对 .flatMap(new Func1<Observable.GroupedObservable<String, Student>, Observable<Map.Entry<String, Long>>>() { @Override public Observable<Map.Entry<String, Long>> call(final Observable.GroupedObservable<String, Student> groupedObservable) { return groupedObservable.count() .map(new Func1<Long, Map.Entry<String, Long>>() { @Override public Map.Entry<String, Long> call(Long count) { // 用AbstractMap.SimpleEntry存储键值对(Java7没有Map.entry()方法) return new AbstractMap.SimpleEntry<>(groupedObservable.getKey(), count); } }); } }); // 订阅结果,输出统计信息 postalCodeCount.subscribe(new rx.Observer<Map.Entry<String, Long>>() { @Override public void onNext(Map.Entry<String, Long> entry) { System.out.printf("邮政编码: %s,学生人数: %d%n", entry.getKey(), entry.getValue()); } @Override public void onError(Throwable e) { System.err.println("统计出错: " + e.getMessage()); e.printStackTrace(); } @Override public void onCompleted() { System.out.println("所有分组统计完成"); } }); } // 模拟获取学生列表的方法,你可以替换成实际的数据源 private static List<Student> getStudentList() { List<Student> students = new ArrayList<>(); students.add(new Student("100001", "张三")); students.add(new Student("100001", "李四")); students.add(new Student("200001", "王五")); students.add(new Student("200001", "赵六")); students.add(new Student("300001", "孙七")); return students; } } // 假设的Student实体类 class Student { private String postalCode; private String name; public Student(String postalCode, String name) { this.postalCode = postalCode; this.name = name; } public String getPostalCode() { return postalCode; } public String getName() { return name; } }
关键细节解释
- RxJava版本选择:一定要用RxJava 1.x(比如1.3.8版本),RxJava 2.x及以上依赖Java8的Lambda和默认方法,Java7跑不起来。
- groupBy操作符:把原始的
Observable<Student>拆分成多个GroupedObservable,每个分组对应一个唯一的邮政编码,分组的key就是邮编。 - flatMap + count:对每个分组执行
count()得到该组的学生数量,再通过map把分组key和数量打包成Map.Entry,flatMap负责把多个分组的结果合并成一个Observable输出。 - AbstractMap.SimpleEntry:Java7没有Java8里的
Map.entry()静态方法,所以用这个类来创建键值对,方便存储邮编和统计数。
内容的提问来源于stack exchange,提问作者sameh
相关产品推荐
相关产品推荐

