面试题答案
一键面试- 并行流的使用思路
- 首先利用
Stream
的parallel()
方法将顺序流转换为并行流,以充分利用多CPU核心。 - 分组操作可以使用
Collectors.groupingBy
,在并行环境下,它能自动处理数据的分区和合并。 - 对于每组数据的复杂计算,要确保计算过程是线程安全的,例如使用不可变对象或者线程安全的集合。同时,避免在计算过程中产生大量中间数据,以免造成性能瓶颈。
- 首先利用
- 关键代码示例
假设我们有一个
Person
类,包含name
和age
属性,要按age
分组并计算每个年龄组中名字的长度总和。
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class ParallelStreamExample {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 30));
people.add(new Person("Charlie", 25));
Map<Integer, Integer> result = people.parallelStream()
.collect(Collectors.groupingBy(
Person::getAge,
Collectors.summingInt(p -> p.getName().length())
));
result.forEach((age, sumLength) -> System.out.println("Age " + age + ": Total name length = " + sumLength));
}
}
在上述代码中:
people.parallelStream()
将List
转换为并行流。Collectors.groupingBy(Person::getAge, Collectors.summingInt(p -> p.getName().length()))
按age
分组,并对每个组内的名字长度进行求和。这一操作在并行流环境下能够并行执行,有效利用多CPU资源,并且Collectors
中的方法在并行处理时是线程安全的。