1.相关定义
函数式接口:有且只能有1个抽象方法的接口
Lambda表达式和函数式接口的关系:只要对象是函数式接口的实例,此对象就可使用Lambda表达式来表示
2.Lambda表达式使用
Lambda表达式语法:(形参列表)->{方法体} ,->为lambda操作符或箭头操作符。形参列表对应接口实现类中重写方法的形参列表。方法体对应接口实现类中重写方法的方法体
无返回值无参数:NoParameterNoReruen obj = ()->{System.out.println("无返回值无参数");};
无返回值单个参数:OneParameterNoReturn obj = (String s)->{System.out.println("无返回值单个参数:"+s)}
无返回值多个参数:MoreParameterNoReturn obj = (String s1,String s2)->{System.out.pringln(s1,s2);};
有返回值无参数:NoParameterHasReturn obj = ()->{return 1;}
有返回值1个参数:OneParameterHaseReturn obj = (String s)->{return s;}
有返回值多个参数:MoreParameterHasReturn obj = (String s1,String s2)->{return s1+s2;};
省略形参类型:OneParameterHaseReturn obj = (s1,s2)->{System.out.pringln(s1+","+s2);};
一个形参省略参数类型和小括号:OneParameterHaseReturn obj = s1->{Syetem.out.println(s1);};
方法体只有1行代码可省略大括号:NoParameterHasReturn obj = ()->System.out.println("11");
方法体只有1条return语句,则return和{}都可省略:MoreParameterHasReturn obj = (s1)->"请求参数为:"+s1;
四个基本函数接口:
消费型接口:Consumer<T> 对应抽象方法:void accept(T t);
生产型接口:Supplier<T> 对应抽象方法:T get();
转换型接口:Function<T> 对应抽象方法:R apply(T t);
判断型接口:Predicate<T> 对应抽象方法:boolean test(T t);
3.方法引用
3.1 lambda表达式中除了调用现有方法外不做其余操作,则有机会使用方法引用实现。方法引用有以下四类:
实例方法引用:
语法:对象::实例方法
特点:lambda表达式的方法体中,通过某个对象调用指定的某个实例方法
要求:函数式接口中抽象方法的返回值和形参列表和内部通过对象调用某个实例方法的返回值类型和形参列表保持一致
实例:实例化Consumer接口的实例化对象,并在重写的accept方法中输出形参的值
Lambda表达式:Consumer<String> consumer = str->Sout("11");
方法引用:Consumer<String> consumer = System.out:println; Sout(consumer.accept("11"));
实例2:实例化Supplier接口的实例化对象,并在重写方法中返回teacher的name
lambda表达式:Supplier<String> supplier = ()->teacher.getName;
方法引用:Supplier<String> supplier = teacher::getName; Sout(supplier.get());
3.2 静态方法引用:
语法:类名::静态方法
特点:lambda表达式方法体中,通过类名调用某静态方法
要求:函数式接口中抽象方法的返回值和形参列表和内部通过类名调用某静态方法的返回值类型和参数列表保持一致
实例-使用Comparator比较器,比较两个整数大小
lambda表达式:Comparator<Integer> comparator = (o1,o2)->Integer.compare(o1,o2);
方法引用:Comparator<Integer> comparator = Integer :: compare; Sout(comparator.compare(1,2));
实例2-实例化Function接口的实例化对象,并在重写的方法中返回小数取整的结果
lambda表达式:Function<Double,Long> function = num -> Math.round(num);
方法引用:Function<Double,Long> function = Math::round; Sout(function.apply(3.14));
3.3 特殊方法引用:
类名::实例方法
特点:在lambda表达式的方法体中,通过方法的第一个形参调用指定的某个实例方法
要求:把函数式接口中抽象方法的第一个形参作为方法的调用者对象,并且从第二个形参开始或无参对应到该被调用实例方法的参数列表中,并且返回类型保持一致
实例-使用Comparator比较器,比较两个数大小
Lambda表达式:Comparator<Double> comparater = (o1,o2)->o1.compareTo(o2);
方法引用方式:Comparator<Double> comparator = Double :: compateTo;
实例2-实例化Function接口的实例化对象,然后获得传入Teacher对象的姓名
Lambda表达式:Function<Teacher,String> function = e->e.getName();
方法引用方式:Function<Teacher,String> function = Teacher::getName; Sout(function.apply(teacher));
3.4 构造方法引用:
语法:类型::new
特点:在lambda表达式的方法体中,返回指定类名中创建的对象
要求:创建对象所调用构造方法,形参列表和重写方法的形参保持一致,并且重写方法的返回值类型和创建对象的类型保持一致
实例:实例化Supplier接口的实例化对象,然后调用重写方法返回Teacher对象
lambda表达式:Supplier<Teacher> supplier = ()->new Teacher();
方法引用方式:Supplier<Teacher> supplier = Teacher::new;Sout(supplier.get());
实例2-实例化Function接口的实例化对象,然后调用重写方法返回Teacher对象
lambda表达式:Function<String,Teacher> function = name->new Teacher(name);
方法引用方式:Function<String,Teacher> function = Teacher::new; Sout(function.apply("jackson"));
3.5 数组引用:
语法:数组类型::new
特点:在lambda的方法体中,创建并返回指定类型的数组
要求:重写的方法有且只有一个整数型的参数,并且该参数就是用于设置数据的空间长度,并且重写方法的返回值类型和创建数组的类型一致
实例:实例化Function接口的实例化对象,并在重写方法中返回指定长度的int类型数组
lambda表达式:Function<Integer,int[]> fun = num->new int[num];
方法引用:Function<Integer,int[]> fun = int[]::new;Sout(fun.apply(30));
4.lambda在集合中的使用
4.1 foreach方法
Collection接口中的foreach方法中,提供了Consumer接口的形参,通过此方法配合lambda表达式可遍历list和set集合
实例:遍历List<Integer>中的元素
lambda表达式:list.foreach(element->Sout(element));
方法引用方式:list.foreach(System.out::println);
实例2:遍历Set<String>集合中的元素
lambda表达式:hashset.foreach(element->Sout(element));
方法引用方式:hashset.foreach(System.out::println);
Map接口中的foreach方法中,提供了BiConsumer接口的形参,BiConsumer接口属于两个参数的消费型接口,通过此方法配合lambda表达式可遍历Map集合
实例:遍历HashMap<String,String>的元素
lambda表达式:hashmap.foreach((k,v)->Sout("key:"+v+",value:"+value));
4.1 removeIf方法
Collection接口中的removeIf方法,提供的removeIf方法的形参为Predicate接口(判断型接口),通过该方法配合lambda表达式可遍历list和set集合
实例:删除list<String>集合中某个元素
lambda表达式:list.removeIf("cc"::equals);
实例2:删除Set<String>集合中某个元素
lambda表达式:set.removeIf("cc"::equals);