lambdas和streams的概念有点弱,所以可能有些东西真的没有任何意义,但我会尝试表达我想要发生的事情。
我有一个类发票,其中有一个项目名称,价格,和数量。我必须映射项目名称和总成本(价格*数量)。
invoiceList.stream()
.map(Invoice::getDesc)
.forEach(System.out.println(Invoice::getPrice*Invoice::getQty));
Pencil 12.00
这将在多个发票对象上完成。
此外,我需要排序他们的总数,也过滤那些超过一定的数量,例如。100.把它们放进地图后我该怎么做?
如果您想要做的只是打印到控制台,那么可以按照以下方式执行:
invoiceList.forEach(i -> System.out.println(i.getName() + " " + (i.getPrice() * i.getQty())));
如果没有,请继续阅读:
Map<String, Double> result =
invoiceList.stream()
.collect(Collectors.toMap(Invoice::getName,
e -> e.getPrice() * e.getQuantity()));
这基本上创建了一个映射,其中键是发票
名称,值是给定发票
的发票价格和数量的乘法。
Map<String, Double> result =
invoiceList.stream()
.collect(groupingBy(Invoice::getName,
Collectors.summingDouble(e -> e.getPrice() * e.getQuantity())));
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));
1)做这件事的正确方法是什么?我做错了什么? 2)流是线程安全的吗?我正在多线程环境中工作,所以我是否应该使用返回TRAAD安全集合的收集器?
首先,我有下面的发票清单。每个列表对象都有一个零件号、一个描述、数量和一个价格。 我将其映射到数量上,并将其排序到数量上,得到以下结果: 但是我如何在上进行映射,以便在我的结果中显示在所显示的数量前面?我不能这样做:
我的理解是lambda的表达式被用来替换抽象实现的boiler-plater代码。因此,如果我必须创建一个接受可运行接口(函数式)的新线程,我不必创建一个新的匿名类,然后提供void run()并在其中编写逻辑,而是可以简单地使用lambda并将其指向一个方法,前提是方法签名与run相同,即不接受任何内容,也不返回任何内容。 但是我不能理解下面的实现 在上面的例子中,printStudent使用了
Lambda表达式是一种很简单的方法,去定义一个匿名函数。Lambda是非常有用的,因为它们避免我们去写一些包含了某些函数的抽象类或者接口,然后在类中去实现它们。在Kotlin,我们把一个函数作为另一个函数的参数。
许多函数都期望枚举并返回一个list 。 这意味着,在使用Enum执行多个操作时,每个操作都将生成一个中间列表,直到我们到达结果。 Streams支持延迟操作,而不是enums的急切操作。 简而言之, streams are lazy, composable enumerables 。 这意味着除非绝对需要,否则Streams不会执行操作。 让我们考虑一个例子来理解这一点 - odd? = &(r
Stream是Java 8中引入的新抽象层。使用stream,您可以以类似于SQL语句的声明方式处理数据。 例如,请考虑以下SQL语句。 SELECT max(salary), employee_id, employee_name FROM Employee 上面的SQL表达式自动返回最大受薪员工的详细信息,而无需在开发人员端进行任何计算。 在Java中使用集合框架,开发人员必须使用循环并进行重