Java 8 作为对象字段列出-如何通过流(Java8)处理它?

Java 8 作为对象字段列出-如何通过流(Java8)处理它?,java-8,Java 8,有一个运单对象有一个设置字段,包装对象有一个价格字段。 我有一张单子。 需要从整个列表中计算所有包装的总成本。 怎样才能顺利通过这条小溪? 多谢各位 class Waybill { Set<Packing> setOfPacking; } class Packing { int PRICE; } List<Waybill> allWaybills = ... 类运单{ 一套包装; } 类包装{ 国际价格; } 列出所有运单=。。。 导入java.ut

有一个运单对象有一个设置字段,包装对象有一个价格字段。 我有一张单子。 需要从整个列表中计算所有包装的总成本。 怎样才能顺利通过这条小溪? 多谢各位

class Waybill {
    Set<Packing> setOfPacking;
}

class Packing {
    int PRICE;
}

List<Waybill> allWaybills = ...
类运单{
一套包装;
}
类包装{
国际价格;
}
列出所有运单=。。。
导入java.util.stream*
列出所有运单=。。。
整数总成本=所有运单
.stream()
.mapToInt(w->w.setOfPacking
.stream()
.mapToInt(p->p.PRICE)
.sum()
)
.sum();
这对我很有用:

double total = allWaybills.stream()
    .flatMap(waybill -> waybill.setOfPacking.stream())
    .mapToInt(packing -> packing.PRICE)
    .sum();
我认为这更容易推理,因为没有任何多级流操作

我想了解如何使用flatMapToInt将flatMap和map操作替换为一个操作,而不使其成为多级操作

下面是一个测试程序:

import java.util.Set;
import java.util.List;
import java.util.HashSet;
import java.util.ArrayList;
import java.util.stream.Collectors;

public class HelloWorld
{
    public static class Packing
    {
        public int PRICE = 0;
    }

    public static class Waybill
    {
        public Set<Packing> setOfPacking = new HashSet<Packing>();
    }

    public static void main(String []args){
        List<Waybill> allWaybills = new ArrayList<Waybill>();

        Waybill w1 = new Waybill();
        Packing p1 = new Packing(); p1.PRICE = 1; w1.setOfPacking.add(p1);
        Packing p2 = new Packing(); p2.PRICE = 2; w1.setOfPacking.add(p2);
        allWaybills.add(w1);

        Waybill w2 = new Waybill();
        Packing p3 = new Packing(); p3.PRICE = 3; w2.setOfPacking.add(p3);
        Packing p4 = new Packing(); p4.PRICE = 4; w2.setOfPacking.add(p4);
        allWaybills.add(w2);

        double total = allWaybills.stream()
            .flatMap(waybill -> waybill.setOfPacking.stream())
            .mapToInt(packing -> packing.PRICE)
            .sum();

        System.out.println("total = "+total);
    }
}
import java.util.Set;
导入java.util.List;
导入java.util.HashSet;
导入java.util.ArrayList;
导入java.util.stream.collector;
公共类HelloWorld
{
公共静态类包装
{
公共整数价格=0;
}
公共静态类运单
{
公共集合setOfPacking=newhashset();
}
公共静态void main(字符串[]args){
列出所有货运单=新建ArrayList();
货运单w1=新货运单();
包装p1=新包装();p1.PRICE=1;w1.setOfPacking.add(p1);
包装p2=新包装();p2.PRICE=2;w1.setOfPacking.add(p2);
所有货运单。添加(w1);
运单w2=新运单();
包装p3=新包装();p3.PRICE=3;w2.setOfPacking.add(p3);
包装p4=新包装();p4.PRICE=4;w2.setOfPacking.add(p4);
所有货运单。添加(w2);
双倍总计=所有货运单。流()
.flatMap(运单->运单.setOfPacking.stream())
.mapToInt(包装->包装.价格)
.sum();
System.out.println(“total=“+total”);
}
}

为了澄清,您所说的“流”是指Java的流API—与.NET的Linq相当的Java,还是指您必须从中反序列化的实际
Java.io.Stream
对象?@Dai是的,我指的是Java.io。Stream@Denis-我想你的意思是
java.util.stream.stream
我想你可以用
flatMapToInt()优化它
(应该可以删除一笔金额)。谢谢!但是请告诉我,有什么区别?更好的flatMap()?@Denis我只是觉得它更容易理解,因为它不是嵌套的。可能从JVM的角度来看,它是完全相同的。您觉得哪一个更容易理解?我了解两者,另一个)有趣的实现是不同的,谢谢您反应如此之快!
import java.util.Set;
import java.util.List;
import java.util.HashSet;
import java.util.ArrayList;
import java.util.stream.Collectors;

public class HelloWorld
{
    public static class Packing
    {
        public int PRICE = 0;
    }

    public static class Waybill
    {
        public Set<Packing> setOfPacking = new HashSet<Packing>();
    }

    public static void main(String []args){
        List<Waybill> allWaybills = new ArrayList<Waybill>();

        Waybill w1 = new Waybill();
        Packing p1 = new Packing(); p1.PRICE = 1; w1.setOfPacking.add(p1);
        Packing p2 = new Packing(); p2.PRICE = 2; w1.setOfPacking.add(p2);
        allWaybills.add(w1);

        Waybill w2 = new Waybill();
        Packing p3 = new Packing(); p3.PRICE = 3; w2.setOfPacking.add(p3);
        Packing p4 = new Packing(); p4.PRICE = 4; w2.setOfPacking.add(p4);
        allWaybills.add(w2);

        double total = allWaybills.stream()
            .flatMap(waybill -> waybill.setOfPacking.stream())
            .mapToInt(packing -> packing.PRICE)
            .sum();

        System.out.println("total = "+total);
    }
}