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

流Java 8 api中是否有aggregateBy方法?

濮阳和泰
2023-03-14

浏览Brian Goetz的这篇非常有趣但只有一年历史的演示文稿-在链接的幻灯片中,他介绍了一个流API中的aggregateBy()方法,该方法应该聚合列表的元素(?)到贴图(给定默认初始值和操作该值的方法(也适用于重复的关键点)-请参见演示文稿中的下一张幻灯片)。

显然,流API中没有这样的方法。在Java 8中是否还有其他类似的方法?

共有3个答案

岑熙云
2023-03-14

这个特定的Javadoc条目是我在Java8中的这个聚合中能找到的最接近的东西。尽管它是第三方API,但签名似乎排列得很好——您提供了一些从中获取值的函数,一些用于值的终端函数(在本例中为零),以及一些将函数和值组合在一起的函数。

这感觉很像一个收藏家,这将使我们能够做到这一点。

Map<String, Integer> strIntMap =
    intList.stream()
           .collect(Collectors
               .groupingBy(Document::getAuthor,
                Collectors.summingInt(Document::getPageCount)));

这样一来,我们就可以根据作者的名字对列表中的每个条目进行分组,并将作者拥有的总页码相加到一张地图中

章建木
2023-03-14

假设我们有一个员工名单,上面有他们的部门和工资,我们想要每个部门支付的总工资。

有几种方法可以做到这一点,例如,您可以使用toMap收集器来聚合每个部门的数据:

  • 第一个参数是关键映射器(您的聚合轴=部门),
  • 第二个是值映射器(要聚合的数据=工资),以及
  • 第三个是合并函数(如何聚合数据=求和值)

例子:

import static java.util.stream.Collectors.*;

public static void main(String[] args) {
  List<Person> persons = Arrays.asList(new Person("John", "Sales", 10000),
                                       new Person("Helena", "Sales", 10000),
                                       new Person("Somebody", "Marketing", 15000));

  Map<String, Double> salaryByDepartment = persons.stream()
          .collect(toMap(Person::department, Person::salary, (s1, s2) -> s1 + s2));
  System.out.println("salary by department = " + salaryByDepartment);
}

对于流,通常有几种方法可以获得所需的结果,例如:

import static java.util.stream.Collectors.*;

Map<String, Double> salaryByDepartment = persons.stream()
        .collect(groupingBy(Person::department, summingDouble(Person::salary)));

作为参考,人员类别:

static class Person {
  private final String name, department;
  private final double salary;
  public Person(String name, String department, double salary) {
    this.name = name;
    this.department = department;
    this.salary = salary;
  }
  public String name() { return name; }
  public String department() { return department; }
  public double salary() { return salary; }
}
娄学文
2023-03-14

聚合操作可以使用Collection类来完成。因此,在视频中,该示例相当于:

Map<String, Integer> map = 
    documents.stream().collect(Collectors.groupingBy(Document::getAuthor, Collectors.summingInt(Document::getPageCount)));

groupingBy方法将为您提供一个映射

这是通过向groupingBy提供下游收集器来完成的,它是sum ming Int,从而生成Map

我认为他们删除了这个操作,并创建了收集器类,以获得一个有用的类,该类包含许多您通常使用的缩减。

 类似资料:
  • ChromeAPI提供了一个获取当前窗口(返回包含当前正在执行的代码的窗口)的方法。Safari有等效的方法吗?

  • 问题内容: 在布莱恩·格茨(Brian Goetz)的这个非常有趣但只有一年历史的演示中,他在幻灯片链接中介绍了应该在Stream API中提供的一种方法,该方法应该将列表(?)的元素聚合到地图(给定默认初始值)以及操作该值的方法(也适用于重复键)-请参见演示文稿中的下一张幻灯片。 显然,Stream API中没有这种方法。还有另一种方法可以在Java 8中执行类似操作吗? 问题答案: 聚合操作可

  • 我知道Java中有无限的流。 有没有办法检查流是否有限? 类似这样的方法

  • 问题内容: Java中是否有内置方法来查找任何数据类型的大小?有什么方法可以找到尺寸? 问题答案: 否。标准Java SE类库中没有这种方法。 设计者的观点是Java不需要它,因为该语言使应用程序1无需知道需要为原始值,对象或具有给定数量的元素的数组保留多少空间。 您可能会认为sizeof运算符对需要了解其数据结构占用多少空间的人很有用。但是,您还可以使用Java内存分析器简单,可靠地获得此信息以

  • 问题内容: 我在chrome和firefox中测试过,这就是问题所在。Date对象的方法有错误?当我在某天设置位置日期时,例如 然后,js代码为: 结果为“ 9”,为什么? 我发现当月有31天时,请运行该方法,该方法将返回错误的值 为什么? 问题答案: 让我们分解一下: 只有当天的值大于传递给的当月的最大天数时,这才是问题。否则,它会按您期望的那样工作。