Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.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 lambda和Streams(数组)_Java_Lambda_Java 8_Java Stream - Fatal编程技术网

Java lambda和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

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

我有一个类发票,其中有一个项目名称、价格和数量。 我必须将项目名称和总成本(价格*数量)对应起来

虽然它不起作用,但希望它能告诉我我有什么问题:

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));