Lambda 使用Java streams从Guava表中提取统计信息

Lambda 使用Java streams从Guava表中提取统计信息,lambda,stream,guava,Lambda,Stream,Guava,给定一个番石榴表表。我想使用Java8打印按工作日分组的统计数据 WeatherInformation类具有用于温度、雪和雨变量的getter方法。 每日工作日天气信息 1 Sunday Temperature=25, Snow=0, Rain=0 2 Monday Temperature=25, Snow=0, Rain=1 3 Tuesday Temperature=25, Snow=0, Rain=2 4 Sunday Tempe

给定一个番石榴表
。我想使用Java8打印按工作日分组的统计数据

WeatherInformation类具有用于温度、雪和雨变量的getter方法。 每日工作日天气信息

    1   Sunday  Temperature=25, Snow=0, Rain=0

    2   Monday  Temperature=25, Snow=0, Rain=1

    3   Tuesday Temperature=25, Snow=0, Rain=2

    4   Sunday  Temperature=25, Snow=0, Rain=3

    5   Monday  Temperature=25, Snow=0, Rain=4

    6   Friday  Temperature=25, Snow=0, Rain=5

    7   Saturday Temperature=25, Snow=0, Rain=6

    8   Sunday  Temperature=25, Snow=0, Rain=7

    9   Monday  Temperature=25, Snow=0, Rain=8

Print:
Sunday = Count:3, Avg[Temp:25; Snow:0; Rain:3.33]
Monday = Count:3, Avg[Temp:25; Snow:0; Rain:4.33]
Tuesday = Count:1, Avg[Temp:25; Snow:0; Rain: 6]
Friday = Count: 1, Avg[Temp:25; Snow:0; Rain: 5]
Saturday = Count: 1, Avg[Temp:25; Snow:0; Rain: 6]

最后你必须聚合平均数据,所以我的想法是将你的天气信息累积到holder类中,最后你可以打印任何类似数据的统计数据

public static void transform(Table<Integer, String, WeatherInformation> data) {
    Map<String, WeatherInformationStats> result =
            data.cellSet().stream()
                .collect(groupingBy(Cell::getColumnKey,
                                    mapping(Cell::getValue,
                                            reducing(new WeatherInformationStats(),
                                                     WeatherInformationStats::of,
                                                     WeatherInformationStats::plus))));
    // Here you're able to do whatever you want with your cumulative data
    // The data look line: Sunday -> {temperature: 12, snow: 10, rain: 7, count: 3}
}

@Data
public static class WeatherInformation {
    protected int temperature;
    protected int snow;
    protected int rain;

    // Getter/setter
}

@Data
public static class WeatherInformationStats extends WeatherInformation {
    protected int count;

    // Getter setter

    public static WeatherInformationStats of(WeatherInformation source) {
        WeatherInformationStats ws = new WeatherInformationStats();
        ws.setTemperature(source.getTemperature());
        ws.setSnow(source.getSnow());
        ws.setRain(source.getRain());
        ws.setCount(1);
        return ws;
    }

    public WeatherInformationStats plus(WeatherInformationStats source) {
        temperature += source.getTemperature();
        snow += source.getSnow();
        rain += source.getRain();
        count += source.getCount();
        return this;
    }
}
公共静态无效转换(表数据){
映射结果=
data.cellSet().stream()
.collect(分组方式)(单元格::getColumnKey,
映射(单元格::getValue,
减少(新的WeatherInformationStats(),
天气信息统计:,
WeatherInformationStats::plus));
//在这里,您可以对累积数据执行任何操作
//数据查询行:星期天->{温度:12,雪:10,雨:7,计数:3}
}
@资料
公共静态类天气信息{
保护温度;
雪的保护;
防雨;
//吸气剂/塞特
}
@资料
公共静态类WeatherInformationStats扩展了WeatherInformation{
保护整数计数;
//吸气剂设定器
公共静态天气信息统计(天气信息源){
WeatherInformationStats ws=新的WeatherInformationStats();
ws.setTemperature(source.getTemperature());
ws.setSnow(source.getSnow());
ws.setRain(source.getRain());
ws.setCount(1);
返回ws;
}
公共WeatherInformationStats plus(WeatherInformationStats来源){
温度+=源。getTemperature();
snow+=source.getSnow();
rain+=source.getRain();
count+=source.getCount();
归还这个;
}
}

谢谢您抽出时间。我通过消除番石榴的依赖性解决了这个问题。