java中的lambda表达式


简介:lambda表达式是Java1.8新增的,在处理Java中,与集合(如:List、Set、Map等)相关的数据,应用较多(例如,筛选List中数据,给List中的数据排序等)。

1. 代替匿名内部类实现接口

1.1 未使用lambda表达式
  • 代码实现
package com.javabasic.lambda;

/**
 * @Description Lambda示例1
 * @ClassName LambdaDemo01
 * @Author yuhuofei
 * @Date 2021/12/19 19:23
 * @Version 1.0
 */
public class LambdaDemo01 {

    //定义一个接口
    interface Printer {
        void printData(String string);
    }

    //定义一个方法
    public void printSomething(String string, Printer printer) {
        //用接口方法打印
        printer.printData(string);
    }

    public static void main(String[] args) {
        LambdaDemo01 lambdaDemo01 = new LambdaDemo01();
        String string = "HelloWorld !";

        //匿名实现类实现接口中的方法
        Printer printer = new Printer() {
            @Override
            public void printData(String string) {
                System.out.println("要输出的数据是:" + string);
            }
        };

        //调用方法
        lambdaDemo01.printSomething(string, printer);
    }

}

  • 运行结果

在这里插入图片描述

1.2 使用lambda表达式
  • 代码实现
package com.javabasic.lambda;

/**
 * @Description Lambda示例1
 * @ClassName LambdaDemo01
 * @Author yuhuofei
 * @Date 2021/12/19 19:23
 * @Version 1.0
 */
public class LambdaDemo01 {

    //定义一个接口
    interface Printer {
        void printData(String string);
    }

    //定义一个方法
    public void printSomething(String string, Printer printer) {
        //用接口方法打印
        printer.printData(string);
    }

    public static void main(String[] args) {
        LambdaDemo01 lambdaDemo01 = new LambdaDemo01();
        String string = "使用lambda !";

        /*

        //常规用法
        Printer printer = (String data) -> {
            System.out.println("要输出的数据是:" + data);
        };

        */
        
        /*

        //简化用法一:(1)可以省略参数类型(2)当只有一个参数时,可以省略参数的小括号
        Printer printer = data -> {
            System.out.println("要输出的数据是:" + data);
        };

        */

        //简化用法二:当函数体只有一行时,可以省略掉花括号
        Printer printer = data -> System.out.println("要输出的数据是:" + data);

        //调用方法
        lambdaDemo01.printSomething(string, printer);
    }

}

  • 运行结果

在这里插入图片描述

2. Stream代替for循环

目标:将列表中所有以c开头的字符串筛选出来,并转换成大写,然后把这些大写的字符串组成一个新的列表进行排序,返回排序后的数组。

2.1 不使用lambda表达式

使用循环语句处理

2.2 使用lambda表达式
  • 代码实现
package com.javabasic.lambda;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description Streams代替for循环
 * @ClassName LambdaDemo02
 * @Author yuhuofei
 * @Date 2021/12/19 21:57
 * @Version 1.0
 */
public class LambdaDemo02 {

    public static void main(String[] args) {

        List<String> list = Arrays.asList("kobe","james","curry","cat");

        List<String> sortedList = list.stream()     //将列表List<String> 转换成流
                .filter(p -> p.startsWith("c"))     //使用filter对流中的数据进行过滤,过滤规则是以"c"开头的字符串
                .map(String::toUpperCase)           //将过滤出来的字符串都转换成大写
                .sorted()                           //将字符串进行排序
                .collect(Collectors.toList());      //将流转换成列表List<String>

        System.out.println("筛选结果是:"+sortedList);
    }

}

3. Stream中filter方法的使用

filter方法主要是用于根据条件,对数据进行过滤和筛选,常见的三种筛选条件分别是and(&&)or(||)negate(!),下面是使用的示例。

3.1 利用&&、||、!做过滤
  • 新建一个Student类
package com.javabasic.entity;

import java.io.Serializable;

/**
 * @Description 学生实体类
 * @ClassName Student
 * @Author yuhuofei
 * @Date 2021/12/26 12:33
 * @Version 1.0
 */
public class Student implements Serializable {
    private final static long serialVersionUID = 1L;

    private String name;
    private String sex;
    private int age;
    private int id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Student(String name, String sex, int age, int id) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.id = id;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", id=" + id +
                '}';
    }
}

  • 新建一个StreamFilterPredicate类,用于演示
package com.javabasic.lambda;

import com.javabasic.entity.Student;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description
 * @ClassName StreamFilterPredicate
 * @Author yuhuofei
 * @Date 2021/12/26 12:37
 * @Version 1.0
 */
public class StreamFilterPredicate {

    public static void main(String[] args) {
        //初始化数据
        Student student1 = new Student("zhangsan", "M", 20, 1);
        Student student2 = new Student("lisi", "M", 20, 2);
        Student student3 = new Student("wangwu", "M", 19, 3);
        Student student4 = new Student("xiaohong", "F", 18, 4);
        Student student5 = new Student("xiaohua", "F", 20, 5);
        Student student6 = new Student("qiuya", "F", 18, 6);
        Student student7 = new Student("xialuo", "M", 20, 7);
        Student student8 = new Student("yuanhua", "M", 19, 8);
        Student student9 = new Student("madongmei", "F", 18, 9);

        //将数据放入列表中
        List<Student> studentList = Arrays.asList(student1, student2, student3, student4, student5, student6, student7, student8, student9);

        //过滤筛选,年龄等于20且性别是M的同学
        List<Student> newStudentList = studentList.stream().filter(p -> p.getAge() == 20 && p.getSex().equals("M")).collect(Collectors.toList());

        //过滤筛选,年龄等于20或者性别是M的同学
        List<Student> newStudentList1 = studentList.stream().filter(p -> p.getAge() == 20 || p.getSex().equals("M")).collect(Collectors.toList());

        //过滤筛选,年龄不等于20且性别不是M的同学
        List<Student> newStudentList2 = studentList.stream().filter(p -> !(p.getAge() == 20 || p.getSex().equals("M"))).collect(Collectors.toList());

        System.out.println("&&作用下的筛选结果是:" + newStudentList);

        System.out.println("||作用下的筛选结果是:" + newStudentList1);

        System.out.println("!作用下的筛选结果是:" + newStudentList2);

    }

}

  • 运行结果如下

在这里插入图片描述

3.2 使用and、or、negate做过滤
  • 在Student类中做出修改,如下
    public static Predicate<Student> ageEquals20 = p -> p.getAge() == 20;
package com.javabasic.entity;

import java.io.Serializable;
import java.util.function.Predicate;

/**
 * @Description 学生实体类
 * @ClassName Student
 * @Author yuhuofei
 * @Date 2021/12/26 12:33
 * @Version 1.0
 */
public class Student implements Serializable {
    private final static long serialVersionUID = 1L;

    private String name;
    private String sex;
    private int age;
    private int id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Student(String name, String sex, int age, int id) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.id = id;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", id=" + id +
                '}';
    }

    public static Predicate<Student> ageEquals20 = p -> p.getAge() == 20;

    public static Predicate<Student> getSexForM = p -> p.getSex().equals("M");

}

  • StreamFilterPredicate类也做出修改,如下
package com.javabasic.lambda;

import com.javabasic.entity.Student;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description
 * @ClassName StreamFilterPredicate
 * @Author yuhuofei
 * @Date 2021/12/26 12:37
 * @Version 1.0
 */
public class StreamFilterPredicate {

    public static void main(String[] args) {
        //初始化数据
        Student student1 = new Student("zhangsan", "M", 20, 1);
        Student student2 = new Student("lisi", "M", 20, 2);
        Student student3 = new Student("wangwu", "M", 19, 3);
        Student student4 = new Student("xiaohong", "F", 18, 4);
        Student student5 = new Student("xiaohua", "F", 20, 5);
        Student student6 = new Student("qiuya", "F", 18, 6);
        Student student7 = new Student("xialuo", "M", 20, 7);
        Student student8 = new Student("yuanhua", "M", 19, 8);
        Student student9 = new Student("madongmei", "F", 18, 9);

        //将数据放入列表中
        List<Student> studentList = Arrays.asList(student1, student2, student3, student4, student5, student6, student7, student8, student9);

        //过滤筛选,年龄等于20且性别是M的同学
//        List<Student> newStudentList = studentList.stream().filter(p -> p.getAge() == 20 && p.getSex().equals("M")).collect(Collectors.toList());
        List<Student> newStudentList = studentList.stream().filter(Student.ageEquals20.and(Student.getSexForM)).collect(Collectors.toList());


        //过滤筛选,年龄等于20或者性别是M的同学
//        List<Student> newStudentList1 = studentList.stream().filter(p -> p.getAge() == 20 || p.getSex().equals("M")).collect(Collectors.toList());
        List<Student> newStudentList1 = studentList.stream().filter(Student.ageEquals20.or(Student.getSexForM)).collect(Collectors.toList());

        //过滤筛选,年龄不等于20且性别不是M的同学
//        List<Student> newStudentList2 = studentList.stream().filter(p -> !(p.getAge() == 20 || p.getSex().equals("M"))).collect(Collectors.toList());
        List<Student> newStudentList2 = studentList.stream().filter(Student.ageEquals20.or(Student.getSexForM).negate()).collect(Collectors.toList());

        System.out.println("and作用下的筛选结果是:" + newStudentList);

        System.out.println("or作用下的筛选结果是:" + newStudentList1);

        System.out.println("negate作用下的筛选结果是:" + newStudentList2);

    }

}

  • 运行得到的结果

在这里插入图片描述
由此可见,两种方式得到的结果,都是一样的。

4. Stream中map方法的使用

4.1 简单的数据转换

将字符串转换成大写

package com.javabasic.lambda;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description
 * @ClassName StreamMap1
 * @Author yuhuofei
 * @Date 2021/12/26 14:37
 * @Version 1.0
 */
public class StreamMap1 {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Apple","Banana","Pink","Lion");

        //使用常规方式,将list中的元素全部转换成大写
        List<String> listUpper = new ArrayList<>();
        for (String s: list){
            listUpper.add(s.toUpperCase());
        }
        System.out.println("常规方式进行数据转换的结果:"+listUpper);

        //使用管道流
//        List<String> list1 =list.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());
        List<String> list1 =list.stream().map(String::toUpperCase).collect(Collectors.toList());
        System.out.println("使用管道流进行数据转换的结果:"+list1);

        //获取长度并输出
        list.stream().mapToInt(String::length).forEach(System.out::println);


    }
}

4.2 map中多语句数据处理
  • Student类(沿用前面的)
package com.javabasic.entity;

import java.io.Serializable;
import java.util.function.Predicate;

/**
 * @Description 学生实体类
 * @ClassName Student
 * @Author yuhuofei
 * @Date 2021/12/26 12:33
 * @Version 1.0
 */
public class Student implements Serializable {
    private final static long serialVersionUID = 1L;

    private String name;
    private String sex;
    private int age;
    private int id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Student(String name, String sex, int age, int id) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.id = id;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", id=" + id +
                '}';
    }

    public static Predicate<Student> ageEquals20 = p -> p.getAge() == 20;

    public static Predicate<Student> getSexForM = p -> p.getSex().equals("M");

}

  • 新建一个StreamMap2类,做实现
package com.javabasic.lambda;

import com.javabasic.entity.Student;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description
 * @ClassName SreamMap2
 * @Author yuhuofei
 * @Date 2021/12/26 17:05
 * @Version 1.0
 */
public class StreamMap2 {

    public static void main(String[] args) {
        //初始化数据
        Student student1 = new Student("zhangsan", "M", 20, 1);
        Student student2 = new Student("lisi", "M", 20, 2);
        Student student3 = new Student("wangwu", "M", 19, 3);
        Student student4 = new Student("xiaohong", "F", 18, 4);
        Student student5 = new Student("xiaohua", "F", 20, 5);
        Student student6 = new Student("qiuya", "F", 18, 6);
        Student student7 = new Student("xialuo", "M", 20, 7);
        Student student8 = new Student("yuanhua", "M", 19, 8);
        Student student9 = new Student("madongmei", "F", 18, 9);

        //将数据放入列表中
        List<Student> studentList = Arrays.asList(student1, student2, student3, student4, student5, student6, student7, student8, student9);

        //利用管道流进行处理,对所有元素的年龄都加1,性别替换成Male或者Female
        List<Student> newList = studentList.stream().map(p -> {
            p.setAge(p.getAge() + 1);
            p.setSex(p.getSex().equals("M") ? "Male" : "Female");
            return p;
        }).collect(Collectors.toList());

        System.out.println("处理后的列表是:" + newList);

    }

}

4.3 利用flatmap处理二维数组数据
  • 代码如下所示
package com.javabasic.lambda;

import java.util.Arrays;
import java.util.List;

/**
 * @Description 将列表中的字母逐个取出来
 * @ClassName StreamMap3
 * @Author yuhuofei
 * @Date 2021/12/26 20:47
 * @Version 1.0
 */
public class StreamMap3 {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Hello", "World");

        //利用map方法,得到的结果是两个字符串,不符合要求
        list.stream().map(p -> p.split("")).forEach(System.out::println);

        //利用flatMap方法
        list.stream().flatMap(p -> Arrays.stream(p.split(""))).forEach(System.out::println);
    }
}

  • 结果如下所示

在这里插入图片描述

5. limit、skip、distinct、sorted方法在Stream中的使用

5.1 limit、skip、distinct、sorted方法的使用
package com.javabasic.lambda;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @Description
 * @ClassName StreamState
 * @Author yuhuofei
 * @Date 2021/12/26 22:20
 * @Version 1.0
 */
public class StreamState {
    public static void main(String[] args) {

        //使用limit,限制数量
        List<String> limitDemo = Arrays.asList("Monkey", "Lion", "Giraffe", "Lemur");
        List<String> limitN = limitDemo.stream().limit(2).collect(Collectors.toList());
        System.out.println("使用limit得到的结果:" + limitN);

        //使用skip,跳过
        List<String> skipN = Stream.of("Monkey", "Lion", "Giraffe", "Lemur").skip(2).collect(Collectors.toList());
        System.out.println("使用skip得到的结果:" + skipN);

        //使用distinct,去重
        List<String> unique = Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion", "Monkey").distinct().collect(Collectors.toList());
        System.out.println("使用distinct得到的结果:" + unique);

        //使用sorted,排序
        List<String> order = Stream.of("Monkey", "Lion", "Giraffe", "Lemur").sorted().collect(Collectors.toList());
        System.out.println("使用sorted得到的结果:" + order);

    }
}

在这里插入图片描述

5.2 并行操作

在Stream中,parallel()方法表示并行操作,而一般没有特别指明,通常我们用的都是串行操作(即执行sequential()方法)。

一般是执行无状态的操作,才用并行,因为并行是不能保证顺序的。

以下是一些无状态和有状态操作的区分:

在这里插入图片描述

6. 集合排序

  • 沿用前面的Student类
package com.javabasic.entity;

import java.io.Serializable;
import java.util.function.Predicate;

/**
 * @Description 学生实体类
 * @ClassName Student
 * @Author yuhuofei
 * @Date 2021/12/26 12:33
 * @Version 1.0
 */
public class Student implements Serializable {
    private final static long serialVersionUID = 1L;

    private String name;
    private String sex;
    private int age;
    private int id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Student(String name, String sex, int age, int id) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.id = id;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", id=" + id +
                '}';
    }

    public static Predicate<Student> ageEquals20 = p -> p.getAge() == 20;

    public static Predicate<Student> getSexForM = p -> p.getSex().equals("M");

}

  • 新建一个SortList类
package com.javabasic.lambda;

import com.javabasic.entity.Student;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

/**
 * @Description 集合排序
 * @ClassName SortList
 * @Author yuhuofei
 * @Date 2021/12/27 0:10
 * @Version 1.0
 */
public class SortList {

    public static void main(String[] args) {

        //初始化数据
        Student student1 = new Student("zhangsan", "M", 20, 1);
        Student student2 = new Student("lisi", "M", 20, 2);
        Student student3 = new Student("wangwu", "M", 19, 3);
        Student student4 = new Student("xiaohong", "F", 18, 4);
        Student student5 = new Student("xiaohua", "F", 20, 5);
        Student student6 = new Student("qiuya", "F", 18, 6);
        Student student7 = new Student("xialuo", "M", 20, 7);
        Student student8 = new Student("yuanhua", "M", 19, 8);
        Student student9 = new Student("madongmei", "F", 18, 9);

        //将数据放入列表中
        List<Student> studentList = Arrays.asList(student1, student2, student3, student4, student5, student6, student7, student8, student9);

        //进行排序,(1)先按性别排序(2)然后按年龄排序(3)最后将前面的进行倒序排序
        studentList.sort(
                Comparator.comparing(Student::getSex)
                .thenComparing(Student::getAge)
                .reversed()
        );

        //输出结果
        studentList.forEach(System.out::println);
    }
}

在这里插入图片描述

7. 函数式接口

最典型的函数式接口,Comparator接口

7.1 函数式接口的特点
  • 接口有且仅有一个抽象方法,如Comparator接口中的compare方法
  • 允许定义静态非抽象方法
  • 允许定义默认default非抽象方法
  • 允许java.lang.Object中的public方法,如Comparator接口中的equals方法
  • FunctionInterface注解不是必须的
7.2 接口中default关键字的作用
  • 问题:当一个接口有很多的实现类时,修改这个接口就变成了一个非常麻烦的事情,需要修改这个接口的所有实现类。

  • default方法可以有自己的默认实现,即有方法体。

  • 接口实现类可以不去实现default方法,并且可以使用default方法。

7.3 自定义函数式接口中的实现方法

重写Comparator接口中的抽象方法compare()

  • 代码如下
package com.javabasic.lambda;

import com.javabasic.entity.Student;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

/**
 * @Description 集合排序
 * @ClassName SortList
 * @Author yuhuofei
 * @Date 2021/12/27 0:10
 * @Version 1.0
 */
public class SortList {

    public static void main(String[] args) {

        //初始化数据
        Student student1 = new Student("zhangsan", "M", 20, 1);
        Student student2 = new Student("lisi", "M", 20, 2);
        Student student3 = new Student("wangwu", "M", 19, 3);
        Student student4 = new Student("xiaohong", "F", 18, 4);
        Student student5 = new Student("xiaohua", "F", 20, 5);
        Student student6 = new Student("qiuya", "F", 18, 6);
        Student student7 = new Student("xialuo", "M", 20, 7);
        Student student8 = new Student("yuanhua", "M", 19, 8);
        Student student9 = new Student("madongmei", "F", 18, 9);

        //将数据放入列表中
        List<Student> studentList = Arrays.asList(student1, student2, student3, student4, student5, student6, student7, student8, student9);

        //进行排序,(1)先按性别排序(2)然后按年龄排序(3)最后将前面的进行倒序排序
        studentList.sort(
                Comparator.comparing(Student::getSex)
                .thenComparing(Student::getAge)
                .reversed()
        );

        //输出结果
        studentList.forEach(System.out::println);

        System.out.println("==================分隔线=================");

        //自定义实现compare方法,按年龄大小进行排序
        studentList.sort((o1, o2) -> {
            if (o1.getAge() == o2.getAge()) {
                return 0;
            }
            return o1.getAge() - o2.getAge() > 0 ? -1 : 1;
        });

        //输出结果
        studentList.forEach(System.out::println);

    }
}

  • 运行结果

在这里插入图片描述

8. Stream查找与匹配元素

实际开发中,常见的需求点:

  • 是否包含某一个“匹配规则”的元素
  • 是否所有的元素都符合某一个“匹配规则”
  • 是否所有的元素都不符合某一个“匹配规则”
  • 查找第一个符合“匹配规则”的元素
  • 查找任意一个符合“匹配规则”的元素

代码示例如下:

package com.javabasic.lambda;

import com.javabasic.entity.Student;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

/**
 * @Description
 * @ClassName StreamUse
 * @Author yuhuofei
 * @Date 2021/12/27 1:25
 * @Version 1.0
 */
public class StreamUse {

    public static void main(String[] args) {

        //初始化数据
        Student student1 = new Student("zhangsan", "M", 20, 1);
        Student student2 = new Student("lisi", "M", 20, 2);
        Student student3 = new Student("wangwu", "M", 19, 3);
        Student student4 = new Student("xiaohong", "F", 18, 4);
        Student student5 = new Student("xiaohua", "F", 20, 5);
        Student student6 = new Student("qiuya", "F", 18, 6);
        Student student7 = new Student("xialuo", "M", 20, 7);
        Student student8 = new Student("yuanhua", "M", 19, 8);
        Student student9 = new Student("madongmei", "F", 18, 9);

        //将数据放入列表中
        List<Student> studentList = Arrays.asList(student1, student2, student3, student4, student5, student6, student7, student8, student9);

        //(1)是否包含某一个“匹配规则”的元素  ----是否包含年龄大于19岁的学生
        boolean isExistAgeThan19 = studentList.stream().anyMatch(e -> e.getAge() > 19);
        System.out.println("是否包含年龄大于19岁的元素:" + isExistAgeThan19);

        //(2)是否所有的元素都符合某一个“匹配规则”  ----是否所有学生都大于16岁
        boolean isExistAgeThan16 = studentList.stream().allMatch(e -> e.getAge() > 16);
        System.out.println("是否所有元素都大于16岁:" + isExistAgeThan16);

        //(3)是否所有的元素都不符合某一个“匹配规则”  ----是否所有学生都不小于18岁
        boolean isExistAgeThan18 = studentList.stream().noneMatch((e -> e.getAge() < 18));
        System.out.println("是否所有元素都不小于18岁:" + isExistAgeThan18);

        //(4)查找第一个符合“匹配规则”的元素  ----查找列表中第一个19岁的学生
        Optional<Student> student = studentList.stream().filter(p -> p.getAge() == 19).findFirst();
        System.out.println("查找列表中第一个19岁的学生:" + student.get());

        //(5)查找任意一个符合“匹配规则”的元素  ----查找列表中任意一个20岁的学生
        Optional<Student> anyStudent = studentList.stream().filter(p -> p.getAge() == 18).findAny();
        System.out.println("查找列表中任意一个18岁的学生:" + anyStudent.get());

    }
}

执行结果如下

在这里插入图片描述

9. Stream中的归约与收集

说明:示例中的Student类,沿用前面创建的。

1、代码示例如下:

package com.javabasic.lambda;

import com.javabasic.entity.Student;

import java.util.Arrays;
import java.util.List;

/**
 * @Description 归约
 * @ClassName ReduceDemo
 * @Author yuhuofei
 * @Date 2021/12/29 23:44
 * @Version 1.0
 */
public class ReduceDemo {

    public static void main(String[] args) {

        //示例1
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
        Integer total = numbers.stream().reduce(0, (s, e) -> s + e);
        System.out.println("使用lambda表达式得到的和是:" + total);
        total = numbers.stream().reduce(0, Integer::sum);
        System.out.println("调用Integer自带的方法得到的和:" + total);

        //示例2
        List<String> letters = Arrays.asList("a", "b", "c", "s", "e", "t");
        String s = letters.stream().reduce("", String::concat);
        System.out.println("得到的字符串是:" + s);

        //示例3
        Student student1 = new Student("zhangsan", "M", 20, 1);
        Student student2 = new Student("lisi", "M", 20, 2);
        Student student3 = new Student("wangwu", "M", 19, 3);
        Student student4 = new Student("xiaohong", "F", 18, 4);
        Student student5 = new Student("xiaohua", "F", 20, 5);
        Student student6 = new Student("qiuya", "F", 18, 6);
        Student student7 = new Student("xialuo", "M", 20, 7);
        Student student8 = new Student("yuanhua", "M", 19, 8);
        Student student9 = new Student("madongmei", "F", 18, 9);

        List<Student> studentList = Arrays.asList(student1, student2, student3, student4, student5, student6, student7, student8, student9);

        //示例3:实现方式一
        Integer sumAge = studentList.stream()
                .map(Student::getAge)                       //使用map,将流中的Student对象都转换成age
                .reduce(0, Integer::sum);           //对所有age求和
        System.out.println("所有学生的年龄和:" + sumAge);

        //示例3:实现方式二
        Integer paraSumAge = studentList.parallelStream()           //并行方式,提高执行效率
                .map(Student::getAge)                               //使用map,将流中的Student对象都转换成age
                .reduce(0, Integer::sum, Integer::sum);     //三个参数含义:初始值,累加器,合并器
        System.out.println("并行方式求所有学生的年龄和:" + paraSumAge);

        //示例3:实现方式三
        Integer age = studentList.stream().reduce(0, (sum, student) -> sum + student.getAge(), Integer::sum);
        System.out.println("直接使用reduce方法求所有学生的年龄和:" + age);
    }
}


2、代码运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值