Java 8 Collectors

原文:https://www.studytonight.com/java-8/java-8-collectors-class

在 Java 8 版本中,增加了一个新的类来执行约简操作,例如将元素累积到集合中,根据各种标准汇总元素等。

Collectors类适用于 Java 流,因此我们建议您了解Lambda 表达式方法引用。如果您不熟悉这些内容,您可以在我们的门户网站上通过单击主题来阅读这些主题。

Collectors是扩展对象类的最终类,位于 java.util.stream 包中。

申报

public final class Collectors extends Object

Collectors类方法

以下是Collectors类的方法。

|

修饰符和类型

|

方法和描述

| | 静态收集器平均双倍(到双倍函数 super T>映射器)</t> | 它返回一个收集器,该收集器产生应用于输入元素的双值函数的算术平均值。 | | 静态收集器平均积分(到函数 super T>映射器)</t> | 它返回一个收集器,该收集器生成应用于输入元素的整数值函数的算术平均值。 | | 静态收集器平均长(ToLongFunction super T>映射器)</t> | 它返回一个收集器,该收集器产生应用于输入元素的长值函数的算术平均值。 | | 静态收集器收集深度(收集器下游,功能整理器)</t></t> | 它调整收集器以执行额外的整理转换。 | | 静态采集器计数()</t> | 它返回一个接受 T 类型元素的收集器,该收集器计算输入元素的数量。 | | 静态收集器> >分组 By(功能 super T,? extends K>分类器)</t> | 它返回一个收集器,该收集器对类型为 T 的输入元素执行“分组依据”操作,根据分类函数对元素进行分组,并在映射中返回结果。 | | 静态收集器></t>分组(功能 super T,? extends K>分类器,收集器 super T,A,D>下游) | 它返回一个 Collector,该 Collector 对 T 类型的输入元素执行级联“分组依据”操作,根据分类函数对元素进行分组,然后使用指定的下游 Collector 对与给定键相关联的值执行约简操作。 | | 静 > 采集器< T、?,M >分组(功能 super T,? extends K>分类器,供应商映射工厂,收集器 super T,A,D>下游) | 它返回一个 Collector,该 Collector 对 T 类型的输入元素执行级联“分组依据”操作,根据分类函数对元素进行分组,然后使用指定的下游 Collector 对与给定键相关联的值执行约简操作。 | | 静态收集器> >分组当前(功能 super T,? extends K>分类器)</t> | 它返回一个并发收集器,该收集器对类型为 T 的输入元素执行“分组依据”操作,根据分类函数对元素进行分组。 | | 静态收集器></t>groupingByConcurrent(功能 super T,? extends K>分类器,收集器 super T,A,D>下游) | 它返回一个并发收集器,该收集器对类型为 T 的输入元素执行级联“分组”操作,根据分类函数对元素进行分组,然后使用指定的下游收集器对与给定键相关联的值执行约简操作。 | | 静 > 采集器< T、?,M >groupingByConcurrent(功能 super T,? extends K>分类器,供应商映射工厂,收集器 super T,A,D>下游) | 它返回一个并发收集器,该收集器对类型为 T 的输入元素执行级联“分组”操作,根据分类函数对元素进行分组,然后使用指定的下游收集器对与给定键相关联的值执行约简操作。 | | 静态收集器连接() | 它返回一个收集器,按照相遇顺序将输入元素连接成一个字符串。 | | 静态收集器连接(字符序列分隔符) | 它返回一个 Collector,按照相遇顺序连接由指定分隔符分隔的输入元素。 | | 静态收集器连接(字符序列分隔符、字符序列前缀、字符序列后缀) | 它返回一个 Collector,该 Collector 按照相遇顺序将由指定分隔符分隔的输入元素与指定前缀和后缀连接起来。 | | 静态收集器映射(功能 super T,? extends U>映射器,收集器 super U,A,R>下游) | 它通过在累加之前对每个输入元素应用一个映射函数,使接受 U 类型元素的收集器适应接受 T 类型元素的收集器。 | | 静态采集器>最大比(Comparator super T>Comparator)</t> | 它返回一个收集器,根据给定的Comparator产生最大元素,描述为可选的 | | 静态收集器 > minBy(Comparator super T>Comparator)</t> | 它返回一个收集器,根据给定的Comparator产生最小元素,描述为可选的 | | 静态收集器> >分区 By(谓词 super T>谓词)</t> | 它返回一个收集器,该收集器根据一个谓词对输入元素进行划分,并将它们组织成一个映射>。 | | 静态收集器></t>划分依据(谓词 super T>谓词,收集器 super T,A,D>下游) | 它返回一个收集器,该收集器根据一个谓词对输入元素进行分区,根据另一个收集器减少每个分区中的值,并将它们组织成一个映射,其值是下游减少的结果。 | | 静态收集器>还原(双操作器操作)</t></t> | 它返回一个收集器,该收集器在一个指定的二进制运算符下执行输入元素的缩减。 | | 静态采集器还原(T 身份,双处理器 op)</t></t> | 它返回一个 Collector,该 Collector 使用提供的标识在指定的 BinaryOperator 下执行其输入元素的缩减。 | | 静态收集器减少(U 标识,函数 super T,? extends U>映射器,二进制运算符运算) | 它返回一个收集器,该收集器在指定的映射函数和 BinaryOperator 下执行输入元素的缩减。 | | 静态收集器汇总双(到双功能 super T>映射器)</t> | 它返回一个收集器,该收集器对每个输入元素应用一个双产生映射函数,并返回结果值的汇总统计信息。 | | 静态收集器摘要开始(到功能 super T>映射器)</t> | 它返回一个收集器,该收集器对每个输入元素应用一个产生整数的映射函数,并返回结果值的汇总统计信息。 | | 静态收集器汇总图形(图形功能 super T>映射器)</t> | 它返回一个收集器,该收集器对每个输入元素应用一个长时间产生的映射函数,并返回结果值的汇总统计信息。 | | 静态收集器求和双(到双功能 super T>映射器)</t> | 它返回一个收集器,该收集器产生应用于输入元素的双值函数的和。 | | 静态收集器求和(到函数 super T>映射器)</t> | 它返回一个收集器,该收集器生成应用于输入元素的整数值函数的和。 | | 静态收集器汇总龙(ToLongFunction super T>映射器)</t> | 它返回一个收集器,该收集器产生应用于输入元素的长值函数的和。 | | 静 > 采集器< T、?,丙>至集采(供应商<丙>集采厂) | 它返回一个收集器,该收集器按照相遇顺序将输入元素累积到一个新的集合中。 | | 静态收集器></t>至当前映射(功能 super T,? extends K>键映射器,功能 super T,? extends U>值映射器) | 它返回一个并发收集器,该收集器将元素累积到一个并发映射中,该映射的键和值是将提供的映射函数应用于输入元素的结果。 | | 静态收集器></t>到当前映射(函数 super T,? extends K>键映射器,函数 super T,? extends U>值映射器,二进制运算符合并函数) | 它返回一个并发收集器,该收集器将元素累积到一个并发映射中,该映射的键和值是将提供的映射函数应用于输入元素的结果。 | | 静 > 采集器< T、?,M >到当前映射(功能 super T,? extends K>键映射器,功能 super T,? extends U>值映射器,二进制操作器合并功能,供应商映射供应商) | 它返回一个并发收集器,该收集器将元素累积到一个并发映射中,该映射的键和值是将提供的映射函数应用于输入元素的结果。 | | 静态收集器 > toList()</t> | 它返回一个收集器,该收集器将输入元素累积到一个新列表中。 | | 静态收集器></t>函数 super T,? extends K>键映射器,函数 super T,? extends U>值映射器 | 它返回一个收集器,该收集器将元素累积到一个映射中,该映射的键和值是将提供的映射函数应用于输入元素的结果。 | | 静态收集器></t>函数 super T,? extends K>键映射器,函数 super T,? extends U>值映射器,二进制运算符合并函数) | 它返回一个收集器,该收集器将元素累积到一个映射中,该映射的键和值是将提供的映射函数应用于输入元素的结果。 | | 静 > 采集器< T、?,M >toMap(功能 super T,? extends K>键映射器,功能 super T,? extends U>值映射器,二进制操作器合并功能,供应商映射供应商) | 它返回一个收集器,该收集器将元素累积到一个映射中,该映射的键和值是将提供的映射函数应用于输入元素的结果。 | | 静态收集器 > toSet()</t> | 它返回一个收集器,该收集器将输入元素累积成一个新的集合。 |

在所有这些例子中,我们使用一个类 Employee ,它包含员工的 id名称工资作为实例变量,并使用一个构造器gettersetter 方法作为所有实例变量。让我们看看如何在Collectors类中使用它。

例子

在这个例子中,我们使用Collectors类的toList()方法收集所有员工的姓名并将其存储到列表中。

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

class Employee{
    String id;
    String name;
    double salary;

    public Employee(String id, String name, double salary) {
        this.id = id;
        this.name = name;
        this.salary = salary;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
}

public class STDemo {
    public static void main(String[] args) {
        List<Employee> emp = new ArrayList<>();
        emp.add(new Employee("100", "Sohan", 120000));
        emp.add(new Employee("101", "Mohan", 100050));
        emp.add(new Employee("102", "Rohan", 500050));
        emp.add(new Employee("103", "John",  5000.20));

        List<String> names = emp.stream().map(Employee::getName).collect(Collectors.toList());

        System.out.println(names);
    }
}

【素汉、莫汉、罗翰、约翰】

示例:TreeSet

在这个例子中,我们将所有员工的名字放入一个集合TreeSet。该集合用于存储唯一元素,并查看结果是否包含员工的重复姓名。

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;
public class STDemo {
    public static void main(String[] args) {
        List<Employee> emp = new ArrayList<>();
        emp.add(new Employee("100", "Sohan", 120000));
        emp.add(new Employee("101", "Mohan", 100050));
        emp.add(new Employee("102", "Rohan", 500050));
        emp.add(new Employee("103", "Sohan",  5000.20));

        Set<String> names = emp.stream().map(Employee::getName).collect(Collectors.toCollection(TreeSet::new));

        System.out.println(names);
    }
}

【莫汉、罗翰、索山】

示例:以字符串形式收集数据

在本例中,我们使用joining()方法收集所有员工的姓名,并用逗号分隔。方法在收集记录后返回一个字符串。

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class STDemo {
    public static void main(String[] args) {
        List<Employee> emp = new ArrayList<>();
        emp.add(new Employee("100", "Sohan", 120000));
        emp.add(new Employee("101", "Mohan", 100050));
        emp.add(new Employee("102", "Rohan", 500050));
        emp.add(new Employee("103", "Sohan",  5000.20));

        String names = emp.stream().map(Employee::getName).collect(Collectors.joining(", "));

        System.out.println(names);
    }
}

索山、莫汉、罗翰、索山

示例:

在这个例子中,我们使用 Collectors 类的summingDouble()方法得到所有员工的工资总和。

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class STDemo {
    public static void main(String[] args) {
        List<Employee> emp = new ArrayList<>();
        emp.add(new Employee("100", "Sohan", 120000));
        emp.add(new Employee("101", "Mohan", 100050));
        emp.add(new Employee("102", "Rohan", 500050));
        emp.add(new Employee("103", "Sohan",  5000.20));

        double totalSalary = emp.stream()
                .collect(Collectors.summingDouble((Employee::getSalary)));

        System.out.println(totalSalary);
    }
}

725100.2

示例:

我们可以使用maxBy()方法从工资列表中获得最高的工资。它根据提供的元素顺序返回列表中可用的最高记录。

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

public class STDemo {
    public static void main(String[] args) {
        List<Employee> emp = new ArrayList<>();
        emp.add(new Employee("100", "Sohan", 120000));
        emp.add(new Employee("101", "Mohan", 100050));
        emp.add(new Employee("102", "Rohan", 500050));
        emp.add(new Employee("103", "Sohan",  5000.20));

        Optional<Double> highSalary = emp.stream().map(Employee::getSalary).collect(Collectors.maxBy(Comparator.naturalOrder()));

        System.out.println("Highest Salary : "+highSalary.get());
    }
}

最高工资:500050.0