Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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流-将一个对象分解为2个对象并映射它们(映射、过滤和收集)_Java_Java 8_Stream - Fatal编程技术网

Java流-将一个对象分解为2个对象并映射它们(映射、过滤和收集)

Java流-将一个对象分解为2个对象并映射它们(映射、过滤和收集),java,java-8,stream,Java,Java 8,Stream,我有一门课是这样的: Class SoldProduct { String name; BigDecimal Price; String currency; } 还有像这样的方法签名 SoldProductReport generateReport(Stream<SoldProduct> products) { } 我以前在这样复杂的流上工作过。如何最好地填充该方法?假设现有类具有必要的getter/setter/constructor,方法gen

我有一门课是这样的:

Class SoldProduct {
     String name;
     BigDecimal Price;
     String currency; 
}
还有像这样的方法签名

SoldProductReport generateReport(Stream<SoldProduct> products) {
}

我以前在这样复杂的流上工作过。如何最好地填充该方法?

假设现有类具有必要的getter/setter/constructor,方法
generateReport
应该将
SoldProduct
的输入流重新映射到
Product
列表,然后返回结果报告以及计算总价

示例实现(未测试),假设有某个实例
ExchangeService服务
提供汇率:

SoldProductReport generateReport(流式产品){
列表报告产品=产品
.map(p->新产品(
“USD”。等于(p.getCurrency())
?p.getPrice()
:p.getPrice().乘法(
service.getRate(p.getCurrency()).orElse(BigDecimal.ZERO)
)
))//流
.filter(p->p.getPrice().compareTo(BigDecimal.ZERO)>0)//删除价格为非正的产品
.collect(Collectors.toList());
返回新的SoldProductReport(
reportProducts,//列表
reportProducts.stream()
.map(产品::getPrice)
.reduce(BigDecimal.ZERO,BigDecimal::add)//总计
);
}

分享您迄今为止的尝试会很有帮助。您在
中使用“-ve”是什么意思?如果它为空或-ve,我需要忽略该产品。
-ve
是您的
SoldProduct
对象的
currency
字段中可能包含的字符串吗?如果汇率为null或负值,我应该完全忽略SoldProduct
Class SoldProductReport {
    List<Product> products;
    BigDecimal total;
}


Class Product{
    String name;
    BigDecimal price;
}
interface ExchangeService {
    Optional<BigDecimal> getRate(String Currency);
}