Java 12 引入了 Collectors
接口中一个新的静态方法,它可以对集合执行两个不同的操作,然后合并结果。
方法语法
以下是 teeing
方法的语法:
public static <T, R, R1, R2>
Collector<T, ?, R> teeing(
Collector<? super T, ?, R1> downstream1,
Collector<? super T, ?, R2> downstream2,
BiFunction<? super R1, ? super R2, R> merger
)
在此方法中,传递给 teeing
收集器的集合中的每个元素都会被 downstream1
和 downstream2
收集器处理。一旦这两个收集器都完成了处理,结果将传递给 BiFunction
收集器以合并结果或相应地处理它们。这类似于在集合上调用两个函数,然后再调用第三个函数来处理前两个函数的结果。
这里我们对集合执行不同的操作,然后使用 merger
BiFunction
合并结果。
示例 - 使用 teeing 收集器计算 n 个数的平均值
在这个例子中,我们在 downstream1
收集器中获取数字的总和,在 downstream2
收集器中获取数字的数量,然后在合并函数中计算平均值。当我们在获取一系列数字且不知道流的大小时,这是有用的。
package com.tutorialspoint;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Tester {
public static void main(String[] args) {
double mean
= Stream.of(1, 2, 3, 4, 5, 6, 7)
.collect(Collectors.teeing(
Collectors.summingDouble(i -> i), Collectors.counting(),
(sum, n) -> sum / n));
System.out.println(mean);
}
}
输出:
4.0
示例 - 使用 teeing 收集器获取学生的最低分和最高分
在这个例子中,我们在 downstream1
收集器中获取具有最高分数的学生,在 downstream2
收集器中获取具有最低分数的学生。然后使用合并函数创建包含具有最低分和最高分学生条目的哈希映射。
package com.tutorialspoint;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
public class Tester {
public static void main(String args[]) {
List<Student> students = Arrays.asList(
new Student(1, "Robert", 390),
new Student(2, "Julie", 410),
new Student(3, "John", 440),
new Student(4, "Michael", 420));
HashMap<String, Student> result = students.stream().collect(
Collectors.teeing(
Collectors.maxBy(Comparator.comparing(Student::getMarks)),
Collectors.minBy(Comparator.comparing(Student::getMarks)),
(s1, s2) -> {
HashMap<String, Student> map = new HashMap<>();
map.put("Highest", s1.get());
map.put("Lowest", s2.get());
return map;
}
)
);
System.out.println(result);
}
}
class Student {
int rollNo;
String name;
int marks;
public Student(int rollNo, String name, int marks) {
this.rollNo = rollNo;
this.name = name;
this.marks = marks;
}
@Override
public String toString() {
return "Student [RollNo=" + rollNo + ", Name=" + name + ", Marks=" + marks + "]";
}
public int getRollNo() {
return rollNo;
}
public void setRollNo(int rollNo) {
this.rollNo = rollNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMarks() {
return marks;
}
public void setMarks(int marks) {
this.marks = marks;
}
}
输出:
{Lowest=Student [RollNo=1, Name=Robert, Marks=390], Highest=Student [RollNo=3, Name=John, Marks=440]}