Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于求和浮点java 8的自定义收集器实现_Java_Java 8_Java Stream_Collectors - Fatal编程技术网

用于求和浮点java 8的自定义收集器实现

用于求和浮点java 8的自定义收集器实现,java,java-8,java-stream,collectors,Java,Java 8,Java Stream,Collectors,我正在尝试创建一个类似于收集器的自定义浮点加法。summingDouble() 但我面临两个问题,我不确定如何解决它 BiConsumer-Line#27-void方法不能返回值 Collector.of-行#32-类型收集器中的(供应商,BiConsumer,二进制运算符,收集器.characters…)方法不适用于 参数(Supplier,BiConsumer,二进制运算符) 这里需要做什么来解决问题 公共类CustomCollector{ 公共静态void main(字符串[]args){

我正在尝试创建一个类似于收集器的自定义浮点加法。summingDouble()

但我面临两个问题,我不确定如何解决它

  • BiConsumer
    -Line#27-void方法不能返回值
  • Collector.of
    -行#32-类型收集器中的(供应商,
    BiConsumer
    二进制运算符
    ,收集器.characters…)方法不适用于 参数(
    Supplier
    BiConsumer
    二进制运算符
    ) 这里需要做什么来解决问题
  • 公共类CustomCollector{
    公共静态void main(字符串[]args){
    员工e1=新员工(1,“Tom”,10.2f);
    员工e2=新员工(1,“杰克”,10.4f);
    员工e3=新员工(1,“Harry”,10.4f);
    ArrayList lstEmployee=新的ArrayList();
    lstEmployee.add(e1);lstEmployee.add(e2);lstEmployee.add(e3);
    /*实施1
    *double totalSal=lstEmployee.stream().collect(收集器.summingDouble(e->e.getSal());
    系统输出打印项次(totalSal);
    */  
    //实施2
    函数fun=(e)->e.getSal();
    双消费者消费者=(val,e)->val+e.getSal();
    二进制运算符=(val1,val2)->val1+val2;
    供应商=()->新浮动[2];
    float FtotalSal=lstEmployee.stream().collect(
    (供应商、消费者、经营者)的收款人;
    系统输出打印项次(FtotalSal);
    }
    }
    班级员工{
    int-id;
    字符串名;
    浮球;
    //getter、setter、constructor
    }
    
    如果获取总和是重点。你可以试试下面的方法

     float FtotalSal = (float) lstEmployee.stream().mapToDouble(e -> e.getSal()).sum();
    

    看来,你把我和他搞混了

    您的函数
    (val,e)->val+e.getSal()
    (val1,val2)->val1+val2)
    适用于还原操作,但不适用于
    收集。供应商生产长度为2的
    Float[]
    数组,根本不适合它

    例如,您可以使用

    float f = lstEmployee.stream().reduce(
        0F,
        (val, e) -> val + e.getSal(),
        (val1, val2) -> val1 + val2);
    
    这会带来一些装箱开销,因为所有中间和都表示为
    Float
    对象

    当您创建一个可变容器,该容器能够在不装箱的情况下保存
    float
    值,即
    newfloat[1]
    时,您可以使用避免这种情况。然后,必须提供接受数组参数并更改包含值的函数。由于预期结果是一个
    浮点
    ,而不是一个数组,因此还需要一个finisher来生成最终结果

    float f = lstEmployee.stream().collect(
        Collector.of(
            () -> new float[1], // a container capable of holding one float
            (floatArray,e) -> floatArray[0] += e.getSal(), // add one element to the array
            (a1, a2) -> { a1[0] += a2[0]; return a1; }, // merge two arrays
            array -> array[0]) // extracting the final result value
        );
    

    当然,这只是为了练习,因为您已经知道使用内置功能的更简单解决方案。

    如何使用自定义收集器获得相同的解决方案?我已经实现并评论了所建议的逻辑。这是为了练习。非常感谢@Holger。减价和收款对我来说是个新名词。谢谢你指出这一点
    float f = lstEmployee.stream().collect(
        Collector.of(
            () -> new float[1], // a container capable of holding one float
            (floatArray,e) -> floatArray[0] += e.getSal(), // add one element to the array
            (a1, a2) -> { a1[0] += a2[0]; return a1; }, // merge two arrays
            array -> array[0]) // extracting the final result value
        );