Java lambda和Streams(数组)
lambdas和streams的概念有点弱,所以可能有些东西真的没有任何意义,但我会尝试传达我想要发生的事情 我有一个类发票,其中有一个项目名称、价格和数量。 我必须将项目名称和总成本(价格*数量)对应起来 虽然它不起作用,但希望它能告诉我我有什么问题:Java lambda和Streams(数组),java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,lambdas和streams的概念有点弱,所以可能有些东西真的没有任何意义,但我会尝试传达我想要发生的事情 我有一个类发票,其中有一个项目名称、价格和数量。 我必须将项目名称和总成本(价格*数量)对应起来 虽然它不起作用,但希望它能告诉我我有什么问题: invoiceList.stream() .map(Invoice::getDesc) .forEach(System.out.println(Invoice::getPrice*Invoice::g
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
这将在多个发票对象上完成
此外,我需要按它们的总数对它们进行排序,并过滤那些超过一定数量的,例如100。将它们放置在地图中后,我应该如何执行此操作?如果您只想在控制台上打印,则可以按如下方式执行:
invoiceList.forEach(i -> System.out.println(i.getName() + " " + (i.getPrice() * i.getQty())));
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));
如果没有,请继续阅读:
这将根据发票的名称对发票进行分组,然后对每组的结果求和e.getPrice()*e.getQuantity()
更新: 如果您需要
toMap
版本,并且结果经过过滤,然后按值升序排序,则可以按如下方式进行:
invoiceList.forEach(i -> System.out.println(i.getName() + " " + (i.getPrice() * i.getQty())));
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));
首先,这里是我认为您试图编写的代码:
invoiceList.stream()
.forEach(invoice->System.out.println(invoice.getPrice()*invoice.getQty());
现在让我们看看这里发生了什么:
在列表上调用.stream()
,将创建一个对象,该对象具有可用于对列表内容执行操作的方法foreach
就是这样一种方法,它在每个元素上调用函数map
是另一个这样的方法,但它返回另一个流,其中的内容是原始流的内容,但每个元素都被传递给map的函数的返回值替换
如果查看foreach调用的内部,可以看到lambda。这定义了一个匿名函数,将对
invoiceList
的每个元素调用该函数。->
符号左侧的invoice
变量绑定到流的每个元素,并执行右侧的表达式 这很好,但是我如何根据变量e进行排序呢?也许从最低到最高。谢谢非常感谢,但我想问一下,这两种方法到底有什么区别?只是一种不同的方法?@CarameliaBachmann不,这不仅仅是一种不同的方法。正如我在回答中提到的,如果发票名称在设计模型中是唯一的,则使用toMap
,但如果可以有多个发票对象具有相同的名称,则需要使用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));