gpt4 book ai didi

java - Lambda 和流(数组)

转载 作者:行者123 更新时间:2023-11-30 07:46:12 27 4
gpt4 key购买 nike

对 lambda 和流的概念有点薄弱,所以可能有些东西真的没有任何意义,但我会尝试传达我想要发生的事情。

我有一个发票类,其中包含项目名称、价格和数量。我必须将商品名称映射到总成本(价格*数量)。

虽然它不起作用,但希望它能让我知道我遇到了什么问题:

invoiceList.stream()
.map(Invoice::getDesc)
.forEach(System.out.println(Invoice::getPrice*Invoice::getQty));

我已经知道 forEach 不会工作,因为它映射到变量描述 (getDesc) 而不是 Invoice 对象,我可以在其中使用它的方法来获取其他变量。

所以,如果 item=pencil, price=1, qty=12,我想要的输出是:

Pencil   12.00

这将在多个 Invoice 对象上完成。

此外,我需要按总数对它们进行排序,并过滤掉超过一定数量的那些,例如。 100. 将它们放入 Map 后我应该怎么做?

最佳答案

如果你只想打印到控制台,那么可以按如下方式完成:

invoiceList.forEach(i -> System.out.println(i.getName() + "    " + (i.getPrice() * i.getQty())));

如果没有,请继续阅读:

Using the toMap collector

Map<String, Double> result = 
invoiceList.stream()
.collect(Collectors.toMap(Invoice::getName,
e -> e.getPrice() * e.getQuantity()));

这基本上创建了一个映射,其中键是 Invoice 名称,值是给定 Invoice 的发票价格和数量的乘积。

Using the groupingBy collector

但是,如果可以有多个具有相同名称的发票,那么您可以使用 groupingBy 收集器以及 summingDouble 作为下游收集器:

Map<String, Double> result = 
invoiceList.stream()
.collect(groupingBy(Invoice::getName,
Collectors.summingDouble(e -> e.getPrice() * e.getQuantity())));

这会将 Invoice 按名称分组,然后对每个组求和 e.getPrice() * e.getQuantity() 的结果。


更新:

如果您想要 toMap 版本并且过滤结果然后按值升序排序,可以按如下方式完成:

Map<String, Double> result = invoiceList.stream()
.filter(e -> e.getPrice() * e.getQuantity() > 100)
.sorted(Comparator.comparingDouble(e -> e.getPrice() * e.getQuantity()))
.collect(Collectors.toMap(Invoice::getName,
e -> e.getPrice() * e.getQuantity(),
(left, right) -> left,
LinkedHashMap::new));

或使用 groupingBy 方法:

 Map<String, Double> result =
invoiceList.stream()
.collect(groupingBy(Invoice::getName,
Collectors.summingDouble(e -> e.getPrice() * e.getQuantity())))
.entrySet()
.stream()
.filter(e -> e.getValue() > 100)
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue, (left, right) -> left,
LinkedHashMap::new));

关于java - Lambda 和流(数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50822047/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com