java8新特性stream api如何使用
1、介绍步骤还是结合例子来说明更容易理解一点,首先创建个List集合对象实例,添加4个用来测试的学生实例
List<Student> students = new ArrayList<Student>();
students.add(new Student("Tom", 12, "male", 5));
students.add(new Student("Lili", 11, "female", 4));
students.add(new Student("John", 8, "male", 1));
students.add(new Student("Lucy", 10, "female", 3));
System.out.println("所有学生:");
students.forEach((p) -> System.out.printf("%s;", p.getName()));
先运行下,打印出所有学生名字

2、filter的使用例子,filter对stream按照一定的条件进行过滤,生成一个新的stream
本例中,按照学生年龄进行过滤,过滤年龄大于10岁的学生
System.out.println("下面是年龄大于10岁,年级大于4的学生:");
students.stream()
.filter((p) -> (p.getAge() > 10))
.filter((p) -> (p.getGrade() > 4))
.forEach((p) -> System.out.printf("%s;", p.getName()));
System.out.println();
运行结果如下,打印出大于10岁,年级大于4的是Tom

3、limit/skip,limit返回前n个元素,skip则是跳过前n个元素
System.out.println("最前面2个学生:");
students.stream()
.limit(2)
.forEach((p) -> System.out.printf("%s;", p.getName()));
System.out.println();
System.out.println("跳过前面2个学生:");
students.stream()
.skip(2)
.forEach((p) -> System.out.printf("%s;", p.getName()));
System.out.println();
运行结果如下:

4、max/min,max可以取年龄或者年级最大的元素,min可以取年龄或者年级最小的元素
System.out.println("年龄最大的学生:");
System.out.println(students.stream()
.max((p1, p2) -> (p1.getAge() - p2.getAge()))
.get().getName());
System.out.println("年龄最小的学生:");
System.out.println(students.stream()
.min((p1, p2) -> (p1.getAge() - p2.getAge()))
.get().getName());

5、parallel并行模式,对于大数据量非常有用,mapToInt作用是把学生的年龄映射成int的stream,sum是计算总和
System.out.println("所有学生年龄总和:");
System.out.println(students.stream().parallel().mapToInt(Student::getAge).sum());
运行结果如下,年龄总和为41

6、数值流的构造
System.out.println("数据流的构造:");
IntStream.of(new int[]{1, 2, 3}).forEach(System.out::println);
IntStream.range(1, 3).forEach(System.out::println);
IntStream.rangeClosed(1, 3).forEach(System.out::println);
rangeClosed从打印结果可以看出,是闭区间范围

7、流转换为其它数据结构,有兴趣的可以参考下面的例子测试下结果
