You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java7环境下RxJava实现Student按邮政编码分组统计的方法问询

实现按邮政编码分组并统计学生数量(Java7环境)

在Java7环境下没法用Lambda表达式,所以得靠RxJava 1.x的匿名内部类来实现所有函数式接口(RxJava 2.x要求Java8及以上,不兼容Java7),下面是完整的分组统计方案:

核心思路

  1. 用groupBy操作符按学生的邮政编码拆分原始Observable,得到按邮编分组的GroupedObservable
  2. 对每个分组调用count()统计学生数量
  3. 将分组的邮编(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:24:38