使用Group-by Java 8 Lambda Streaming计算平均值

时间:2019-03-08 21:17:01

标签: java lambda java-8 grouping

我有一个包含2个属性(date and an integer value)的对象列表。我正在尝试编写一个Java 8 lambda函数来过滤列表,以这样一种方式:2.00 and 4.00之间的时间平均值应分别计算,4.01 and 6.00之间的时间值独立计算,而与日期< / p>

public class Obj{
  private Date date;
  private int value;
}

对象映射示例如下

[
{
 date: '2010-02-01 2.00',
 value: 20
},
{
 date: '2010-02-01 4.00',
 value: 5
},
{
 date: '2010-02-02 3.00',
 value: 55
},
{
 date: '2010-02-02 3.30',
 value: 7
},
{
 date: '2010-02-03 5.00',
 value: 88
},
{
 date: '2010-02-03 5.20',
 value: 1
}
]

在这里,20, 5, 55, 7值应单独计算,因为当日期值在2.00到4.00之间时,它们在那里 同样,88 and 1应该分开计算,因为这些值是时间为4.01和6.00的地方

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

为了简化代码。像这样更改您的Obj类

class Obj {
    private String date;
    private int value;
}

并且数据仅包含小时

分组和归约代码如下:

    list.stream()
        .collect(Collectors.groupingBy(new Function<Obj, Integer>() {
            @Override
            public Integer apply(Obj o) {
                return (int) Float.parseFloat(o.getDate()) / 4;
            }
        }, Collectors.summarizingInt(new ToIntFunction<Obj>() {
            @Override
            public int applyAsInt(Obj value) {
                return value.getValue();
            }
        }));