当前位置:嗨网首页>书籍在线阅读

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