当前位置: 首页 > 知识库问答 >
问题:

Lambdas和Streams(数组)

韩弘壮
2023-03-14

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

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

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

这将在多个发票对象上完成。

此外,我需要排序他们的总数,也过滤那些超过一定的数量,例如。100.把它们放进地图后我该怎么做?

共有1个答案

越高峻
2023-03-14

如果您想要做的只是打印到控制台,那么可以按照以下方式执行:

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中使用集合框架,开发人员必须使用循环并进行重