如何应用groupby->;映射->;java8流中的约简

如何应用groupby->;映射->;java8流中的约简,java,lambda,collections,java-8,java-stream,Java,Lambda,Collections,Java 8,Java Stream,我有下面的对象列表 公共类示例{ 私有字符串驱动程序; 私家车; 私人双积分; 专用整数时间; } 我的数据如下所示 我正在尝试按驱动程序分组,然后应用map函数(在上表中提到),然后使用key作为驱动程序,value作为map函数的结果(类型为Double)简化为map。 我在下面试过 list.stream().collect(Collectors.groupingBy(o-> o.getDriverId(), Collectors.mapping()

我有下面的对象列表

公共类示例{
私有字符串驱动程序;
私家车;
私人双积分;
专用整数时间;
}
我的数据如下所示

我正在尝试按驱动程序分组,然后应用map函数(在上表中提到),然后使用key作为驱动程序,value作为map函数的结果(类型为Double)简化为map。 我在下面试过

list.stream().collect(Collectors.groupingBy(o-> o.getDriverId(),
            Collectors.mapping()
            ));

但无法应用映射功能。请提供一些信息以便进一步进行。

我希望这将有助于您解决问题陈述。

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        List<Sample> data = Arrays.asList(
        new Sample("D1","V1",1.0,10),
        new Sample("D1","V2",2.0,20),
        new Sample("D2","V3",3.0,30),
        new Sample("D2","V4",4.0,40));

        Map<String,Double> calculatedDataMapping = new HashMap<>();

        data.stream().collect(Collectors.groupingBy(Sample::getDriver)).forEach((k,v) -> {
            double value = 0.0;
           for(int i = 0 ; i < v.size()-1; i++){
               value = ((v.get(i).getScore() * v.get(i).getTime()) + (v.get(i+1).getScore() * v.get(i+1).getTime()))
                       / (v.get(i).getTime() + v.get(i + 1).getTime());
           }
           calculatedDataMapping.put(k,value);
        });
        System.out.println(calculatedDataMapping);
    }
}
输出

{D1=1.6666666666666667, D2=3.5714285714285716}
谢谢 Girdhar

试试这个:

Map<String, Double> res =
    list.stream()
        .collect(groupingBy(Sample::getDriver,
                            collectingAndThen(
                                reducing(new Sample("", "", 0.0,0),
                                         (a, b) -> new Sample("", "", a.score + b.score * b.time, a.time + b.time)), 
                                         s -> s.score / s.time)));
Map res=
list.stream()
.collect(分组依据)(示例::getDriver,
收集然后(
减少(新样本(“,”,0.0,0),
(a,b)->新样本(“,”,a.score+b.score*b.time,a.time+b.time)),
s->s.score/s.time);

Hi,如果驱动程序有两个条目,您的解决方案将起作用。但在这里,每个驱动程序可以有任意数量的条目。我已经更新了问题。
Map<String, Double> res =
    list.stream()
        .collect(groupingBy(Sample::getDriver,
                            collectingAndThen(
                                reducing(new Sample("", "", 0.0,0),
                                         (a, b) -> new Sample("", "", a.score + b.score * b.time, a.time + b.time)), 
                                         s -> s.score / s.time)));