28-案例实现
案例实现
根据如下步骤实现本案例。
1.首先,实现将在本例中使用的辅助类。先创建 Person 类来存储一个人的基本属性,然后创建 PersonGenerator 类来生成一个包含随机 Person 对象的 List 。这两个类的源代码参见6.5节。
2.然后创建一个包含 main() 方法的 Main 类。在 main() 方法里,先创建一个 int 型数组。然后用 parallelStream() 方法从数组上创建一个并行流,用 sorted() 方法对数组元素进行排序,用 forEachOrdered() 方法按顺序打印元素。注意,这个操作无法完全利用多核处理器,因为它必须按顺序打印:
public class Main {
public static void main(String args[]) {
int[] numbers={9,8,7,6,5,4,3,2,1,2,3,4,5,6,7,8,9};
Arrays.stream(numbers).parallel().sorted().forEachOrdered
(n -> {
System.out.printf("%d\n", n);
});
3.现在在包含 Person 对象的 Stream 中尝试相同操作。用 PersonGenerator 创建一个包含10个随机 Person 对象的 List ,然后还是使用 sorted() 和 forEach-Ordered() 来看看 Person 对象是如何按顺序打印的:
List<Person> persons=PersonGenerator.generatePersonList(10);
persons.parallelStream().sorted().forEachOrdered(p -> {
System.out.printf("%s, %s\n",p.getLastName(),p.getFirstName());
});
4.最后,看看如何使用 unordered() 方法消除一个数据结构的相遇顺序。首先使用包含随机人员的 List 创建 TreeSet 。使用 TreeSet 的原因在于它会在内部排序元素。然后,用循环重复这些操作10次,看看有序操作和无序操作之间的区别:
TreeSet<Person> personSet=new TreeSet<>(persons);
for (int i=0; i<10; i++) {
5.接着用 stream()方 法从 personSet 对象上创建一个流,用 parallel() 方法得到并行流,用 limit() 方法获取第一个元素,然后返回 Person 对象将其收集到一个 List 中并获取第一个元素:
Person person=personSet.stream().parallel().limit(1)
.collect(Collectors.toList()).get(0);
System.out.printf("%s %s\n", person.getFirstName(),
person.getLastName());
6.现在执行相同的操作,但在 stream() 和 parallel() 之间使用 unordered() 方法删除有序约束:
person=personSet.stream().unordered().parallel().limit(1)
.collect(Collectors.toList()).get(0);
System.out.printf("%s %s\n", person.getFirstName(),
person.getLastName());