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());