JDK新特性-Lambda表达式的神操作 (2)

Supplier:代表一个输出
Consumer:代表一个输入
BiConsumer:代表两个输入
Function:代表一个输入,一个输出(一般输入和输出是不同类型的)
UnaryOperator:代表一个输入,一个输出(输入和输出是相同类型的)
BiFunction:代表两个输入,一个输出(一般输入和输出是不同类型的)
BinaryOperator:代表两个输入,一个输出(输入和输出是相同类型的)

在Java中提供了一系列的函数式接口,用来接受后续传入的逻辑,但是对输入和输出有要求

6.1 Supplier:代表一个输出 Supplier<String> s1 = ()->{return "muxiaonong";}; Supplier<String> s2 = ()->"muxiaonong2"; System.out.println(s1.get());//输出 muxiaonong System.out.println(s2.get());//输出 muxiaonong2 6.2 Consumer:代表一个输入 Consumer<String> c11 = (str) -> System.out.println(str); c11.accept("beijing");//输出 beijing 6.3 BiConsumer:代表两个输入 BiFunction<String,String,Integer> bf = (a,b)->a.length()+b.length(); System.out.println(bf.apply("大吉大利", "今晚吃鸡"));//输出一个字符串长度 8 6.4 Function:代表一个输入,一个输出 // Function<String,Integer> 用来接收后面的函数的实现,规定必须有一个输入(String)有一个输出(Integer) Function<String,Integer> f1 = (str)->{return str.length();}; System.out.println(f1.apply("abcdefg"));//输出长度 7 七、方法的引用

方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法,方法引用提供了一种引用而不执行方法的方式,如果抽象方法的实现恰好可以使用调用另外一个方法来实现,就有可能可以使用方法引用

7.1 方法引用的分类 类型 语法 对应的lambda表达式
静态方法引用   类名::staticMethod   (args) -> 类名.staticMethod(args)  
实例方法引用   inst::instMethod   (args) -> inst.instMethod(args)  
对象方法引用   类名::instMethod   (inst,args) -> 类名.instMethod(args)  
构造方法引用   类名::new   (args) -> new 类名(args)  
7.2 静态方法引用

静态方法引用: 如果函数式接口的实现恰好可以通过 调用一个静态方法 来实现,那么就可以使用静态方法引用

/** * @program: lambda * @ClassName Test2 * @description: * @author: muxiaonong * @create: 2020-10-28 22:15 * @Version 1.0 **/ public class Test2 { //无参静态方法 static String put(){ System.out.println("put....."); return "put"; } //有参静态方法 public static void getSize(int size){ System.out.println(size); } //有参 有返回值静态方法 public static String toUpperCase(String str){ return str.toUpperCase(); } //两个入参,一个返回值静态方法 public static Integer getLength(String str,String str2){ return str.length()+str2.length(); } public static void main(String[] args) { //无参静态方法-普通调用 System.out.println(put());//输出put //无参静态方法-原生调用 Supplier<String> s1 = ()-> Test2.put(); System.out.println(s1.get());//输出put //无参静态方法-静态方法引用 Supplier<String> s2 = Test2::put; System.out.println(s2.get());//输出put //无参静态方法-内部类调用 Supplier<String> s3 = Fun::hehe; System.out.println(s3.get()); //输出hehe // 有参静态方法-静态方法引用 Consumer<Integer> c1 = Test2::getSize; Consumer<Integer> c2 = (size)-> Test2.getSize(size); c1.accept(123); c2.accept(111); //有参有返回值静态方法 Function<String,String> f1 = (str)->str.toUpperCase(); Function<String,String> f2 = (str)-> Test2.toUpperCase(str); Function<String,String> f3 = Test2::toUpperCase; Function<String,String> f4 = Test2::toUpperCase; System.out.println(f1.apply("abc"));//输出 ABC System.out.println(f2.apply("abc"));//输出 ABC System.out.println(f3.apply("abc"));//输出 ABC System.out.println(f4.apply("abc"));//输出 ABC // 两个参数 一个返回值 函数式接口 BiFunction<String,String,Integer> bf = (a, b)->a.length()+b.length(); BiFunction<String,String,Integer> bf2 = Test2::getLength; System.out.println(bf2.apply("abc", "def"));//输出 6 System.out.println(bf.apply("abc", "def"));//输出 6 } //内部类 class Fun { public static String hehe(){ return "hehe"; } public static String toUpperCase(String str){ return str.toUpperCase(); } } } 7.3 实例方法引用

实例方法引用: 如果函数式接口的实现恰好可以通过调用一个实例的实例方法来实现,那么就可以使用实例方法引用

public class Test3 { //实例无参方法 public String put(){ return "put..."; } //实例有参方法 public void getSize(int size){ System.out.println("size:"+size); } //实例有参有返回值方法 public String toUpperCase(String str){ return str.toUpperCase(); } public static void main(String[] args) { //实例无参方法返回-普通调用 System.out.println(new Test3().put());//输出 put... Supplier<String> s1 = ()->new Test3().put(); Supplier<String> s2 = ()->{return new Test3().put();}; Supplier<String> s3 = new Test3()::put; System.out.println(s1.get());//输出 put... System.out.println(s2.get());//输出 put... System.out.println(s3.get());//输出 put... //唯一的创建一个test3对象 Test3 test = new Test3(); Consumer<Integer> c1 = (size)->new Test3().getSize(size); Consumer<Integer> c2 = new Test3()::getSize; Consumer<Integer> c3 = test::getSize; c1.accept(123);//输出 size:123 c2.accept(123);//输出 size:123 c3.accept(123);//输出 size:123 Function<String,String> f1 = (str)->str.toUpperCase(); Function<String,String> f2 = (str)->test.toUpperCase(str); Function<String,String> f3 = new Test3()::toUpperCase; Function<String,String> f4 = test::toUpperCase; System.out.println(f1.apply("abc"));//输出 ABC System.out.println(f2.apply("abc"));//输出 ABC System.out.println(f3.apply("abc"));//输出 ABC System.out.println(f4.apply("abc"));//输出 ABC } } 7.4 对象方法引用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsfxzd.html