20-案例实现
案例实现
根据如下步骤实现本案例。
1.首先,要实现将在本案例中使用的辅助类。先创建 Person
类来存储一个人的基本属性,然后创建 PersonGenerator
类来生成一个包含随机 Person
对象的列表。这两个类的源代码参见6.5节。
2.然后创建一个包含 main()
方法的 Main
类。在 main()
方法里,先用 Person-Generator
创建一个列表,它应包含随机的 Person
对象。然后用 forEach()
方法打印生成的元素:
public class Main {
public static void main(String[] args) {
List<Person> persons=PersonGenerator
.generatePersonList(10);
persons.parallelStream().forEach(p-> {
System.out.printf("%s, %s\n", p.getLastName(),
p.getFirstName());
});
3.接着用 distinct()
方法去除重复的对象,并用 forEach()
方法把过滤后剩下的元素打印出来:
persons.parallelStream().distinct().forEach(p-> {
System.out.printf("%s, %s\n", p.getLastName(),
p.getFirstName());
});
4.然后用一个数字数组来测试 distinct()
方法。先创建一个有重复数字的数组,然后用 Arrays
类的 asList()
方法把其转换为 List
。接着调用 List
的 parallelStream()
方法创建并行流,用 mapToInt()
将其转换成 IntStream
,然后用 distinct()
方法删除重复的元素,最后用 forEach()
方法把得到的最终元素打印到控制台:
Integer[] numbers={1,3,2,1,2,2,1,3,3,1,1,3,2,1};
Arrays.asList(numbers).parallelStream().mapToInt(n -> n)
.distinct().forEach( n -> {
System.out.printf("Number: %d\n", n);
});
5.现在,使用 filter
方法从包含随机人员的列表中获取工资低于3000的人,这里用lambda表达式来创建一个断言,以表示该条件。和其他例子一样,这里也用 forEach()
方法打印结果元素:
persons.parallelStream().filter(p -> p.getSalary() < 30000)
.forEach( p -> {
System.out.printf("%s, %s\n", p.getLastName(),
p.getFirstName());
});
6.然后,用 IntStream
测试 filter()
方法,获取小于2的数字:
Arrays.asList(numbers).parallelStream().mapToInt(n -> n)
.filter( n -> n<2).forEach( n-> {
System.out.printf("%d\n", n);
});
7.现在用 limit()
方法来限制元素的数量。比如,从包含随机人员的列表中创建一个并行流,并用 mapToDouble()
方法将其转换为 DoubleStream
,然后用 limit()
方法获取前5个元素:
persons.parallelStream().mapToDouble(p -> p.getSalary())
.sorted().limit(5).forEach(s-> {
System.out.printf("Limit: %f\n",s);
});
8.最后,用 skip()
方法忽略流中一定数量的元素。先从包含随机人员的列表上创建一个并行流,用 mapToDouble()
方法将其转换为 DoubleStream
,最后用 skip()
方法忽略前5个元素:
persons.parallelStream().mapToDouble(p -> p.getSalary())
.sorted().skip(5).forEach(s-> {
System.out.printf("Skip: %f\n",s);
});