欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java8新特性 --- stream(二)

程序员文章站 2022-06-07 13:18:22
...

2、映射

     2.1 map 利用此功能可以输出我们需要的东西

     将学生实体映射成学生姓名

List<String> names = students.stream()
                            .filter(student -> "计算机科学".equals(student.getMajor()))
                            .map(Student::getName).collect(Collectors.toList());
     除了上面这类基础的map,java8还提供了mapToDouble(ToDoubleFunction<? super T> mapper),mapToInt(ToIntFunction<? super T> mapper),mapToLong(ToLongFunction<? super T> mapper)

     计算‘计算机科学’专业的学生年龄之和

int totalAge = students.stream()
                    .filter(student -> "计算机科学".equals(student.getMajor()))
                    .mapToInt(Student::getAge).sum();

     使用这些数值流的好处还在于可以避免jvm装箱操作所带来的性能消耗。
     2.2 flatMap   用于合并用

    

    /** 
     * 测试flatMap类似于addAll的功能 
     */  
    @Test  
    public void flatMapTest() {  
        List<Integer> collected0 = new ArrayList<>();  
        collected0.add(1);  
        collected0.add(3);  
        collected0.add(5);  
        List<Integer> collected1 = new ArrayList<>();  
        collected1.add(2);  
        collected1.add(4);  
        collected1 = Stream.of(collected0, collected1)  
                        .flatMap(num -> num.stream()).collect(Collectors.toList());  
        System.out.println(collected1);// 1,3,5,2,4  
    }  
3、查找

     3.1 allMatch   用于检测是否全部都满足指定的参数行为,如果全部满足则返回true

     检测是否所有的学生都已满18周岁

boolean isAdult = students.stream().allMatch(student -> student.getAge() >= 18);
     3.2 anyMatch   检测是否存在一个或多个满足指定的参数行为,如果满足则返回true

      检测是否有来自武汉大学的学生

boolean hasWhu = students.stream().anyMatch(student -> "武汉大学".equals(student.getSchool()));
     3.3  noneMathch  检测是否不存在满足指定行为的元素

     检测是否不存在专业为‘计算机科学’的学生

boolean noneCs = students.stream().noneMatch(student -> "计算机科学".equals(student.getMajor()));
     3.4 findFirst 返回满足条件的第一条元素
     专业为土木工程的排在第一个学生
Optional<Student> optStu = students.stream().filter(student -> "土木工程".equals(student.getMajor())).findFirst();
     Optional 参考这一篇:Java8新特性 – Optional类

4、归约  对经过参数化操作后的集合进行进一步的运算,那么我们可用对集合实施归约操作
     
// 前面例子中的方法
int totalAge = students.stream()
                .filter(student -> "计算机科学".equals(student.getMajor()))
                .mapToInt(Student::getAge).sum();
// 归约操作
int totalAge = students.stream()
                .filter(student -> "计算机科学".equals(student.getMajor()))
                .map(Student::getAge)
                .reduce(0, (a, b) -> a + b);

// 进一步简化
int totalAge2 = students.stream()
                .filter(student -> "计算机科学".equals(student.getMajor()))
                .map(Student::getAge)
                .reduce(0, Integer::sum);

// 采用无初始值的重载版本,需要注意返回Optional
Optional<Integer> totalAge = students.stream()
                .filter(student -> "计算机科学".equals(student.getMajor()))
                .map(Student::getAge)
                .reduce(Integer::sum);  // 去掉初始值