当前位置: 首页 > 后端技术 > Java

java8中lambda表达式实战讲解

时间:2023-04-01 21:04:30 Java

java8中lambda表达式实战讲解一、lambda简介lambda表达式(lambdaexpression)是一个匿名函数。Lambda表达式是根据数学中的lambda演算来命名的,直接对应其中的lambda抽象(lambdaabstraction)是匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意与传统数学意义上的区别)。Lambda表达式是Java8的一个新特性。编码通常尽可能轻量级,以将代码封装为数据。传统的解决方案是通过接口和实现类(匿名内部类)来实现。这种方法有语法冗余。lambda概述2.lambda特性Lambda表达式理解为一段可以传递的代码,可以写出更简洁灵活的代码。使代码更加简洁紧凑。可以使用并行流进行并行处理,充分利用多核CPU的优势,有利于JIT编译器对代码的优化。publicinterfaceRunnable{voidrun();}匿名内部方法创建线程Tread类传递一个匿名Runnable对象,重载Runnable接口的run()方法实现相应的逻辑。publicstaticvoidmain(String[]args){Threadthread=newThread(newRunnable(){@Override//重写Runnable接口中的run()方法publicvoidrun(){System.out.println("Anonymous内部类方法--thread1");}});thread.start();//启动线程}Lambda表达式创建线程publicstaticvoidmain(String[]args){Threadthread=newThread(()->System.out.println("匿名内部类方法-启动线程2"));thread.start();}4.lambda语法格式4.1Lambda表达式的标准语法格式Lambda表达式是针对函数式接口抽象方法的实现是对其匿名内部类的简写,只保留其参数列表和方法体该方法和其他组件可以省略。因此,Lambda表达式的格式非常简洁,仅由三部分组成:Parameters:指定了Lambda表达式所需的所有参数。如果有多个参数,参数之间用逗号分隔;如果没有参数,请将其留空。箭头:英文中由下划线和大于号组成,写法固定。代表指向动作方法体:Lambda表达式要执行的函数,具体代码方法内容(参数,...,参数)->{方法体}基本语法:(参数)->表达式或(参数)->{语句;}注:可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。可选参数括号:一个参数不需要定义括号,但没有参数或多个参数需要定义括号。可选花括号:如果主体包含语句,则不需要花括号。可选return关键字:如果body只有一个表达式返回值,编译器会自动返回值,花括号需要指定表达式返回值。4.2Lambda表达式省略文法格式在Lambda标准文法格式的基础上,可以使用省略号的书写规则:如果括号内只有一个参数,可以省略。如果括号内没有参数或者有两个或多个参数,则不能省略括号。如果花括号内只有一条语句,不管是否有返回值,花括号、return关键字、分号都可以省略。情况一:无参数,无返回值,只有一条语句publicstaticvoidmain(String[]args){Runnablerunnable=()->System.out.println("lambdarun1");runnable.run();}//lambda运行结果1情况2:一个参数,无返回值publicstaticvoidmain(String[]args){Consumerconsumer=(x)->System.out.println(x);//可用简化消费者consumer=System.out::println;consumer.accept("lambdarun2");}//resultlambdarun2情况三:只有一个参数时,参数的括号可以省略publicstaticvoidmain(String[]args){Consumerconsumer3=x->System.out.println(X);//简化的Consumerconsumer3=System.out::println;consumer3.accept("lambdarun3");}//Resultlambdaruns3情况4:有两个参数,Lambdabody中有多个statement。publicstaticvoidmain(String[]args){Comparatorcom4=(x,y)->{System.out.println("lambdarun4");返回Integer.compare(x,y);};System.out.println(com4.compare(1,2));}//lambda运行结果4-1情况5:参数不止两个,还有一个返回值。如果Lambda主体只有一条语句,return和大括号可以省略,不用写publicstaticvoidmain(String[]args){Comparatorcom5=(x,y)->Integer.compare(x,y);//简化比较器com5=Integer::compare;System.out.println(com5.compare(1,2));}//Result-1情况6:Lambda表达式的参数列表的数据类型可以省略,因为JVM可以通过上下文推断出数据的类型,即“类型推断”publicstaticvoidmain(String[]args){Comparatorcom=(Integerx,Integery)->Integer.compare(x,y);//Comparator可以简化com=Integer::compare;System.out.println(com.compare(1,2));}//result-1公式:如果左右有括号,左边推断类型,可能的话,保存。5、方法引用方法引用的三种形式类::静态方法类::非静态方法对象::非静态方法注:方法引用规定对象不能调用静态方法,这与面向对象的思想是一致的。但是类可以调用非静态方法,这在面向对象中是不允许的。5.1类引用静态方法语法格式:class::static方法名publicstaticvoidmain(String[]args){Comparatorcomparable=Integer::compare;//使用方法引用实现同样的效果ComparatorintegerComparable=Integer::compare;System.out.println(integerComparable.compare(2,1));System.out.println(comparable.compare(2,1));}//result115.2类引用公共方法语法格式:class::Instance方法名publicstaticvoidmain(String[]args){BiPredicatebiPredicate=字符串::等于;//使用方法引用实现同样的效果BiPredicatebp2=String::equals;System.out.println(biPredicate.test("1","2"));System.out.println(biPredicate.test("1","2"));}//结果为falsefalse5.3对象引用不是静态方法语法格式:实例化对象::公共方法;publicstaticvoidmain(String[]args){Consumerconsumer=System.out::println;consumer.accept("java");}//resultJava6.构造引用构造引用语法格式:类名::new与方法引用类似,函数式接口抽象方法形参列表一致与构造函数的形式参数列表。抽象方法的返回值类型为构造函数所属类的类型//data:publicstaticclassEmployee{privateIntegerid;私有字符串名称;私人整数年龄;@OverridepublicStringtoString(){return"Employee{"+"id="+id+",name='"+name+'\''+",age="+age+'}';}publicEmployee(){}publicEmployee(Integerid){this.id=id;}publicEmployee(Integerid,Integerage){this.id=id;这个。年龄=年龄;}publicEmployee(intid,Stringname,intage){this.id=id;this.name=名称;这个。年龄=年龄;}}例子:publicstaticvoidmain(String[]args){//原来的写法Suppliersup=newSupplier<Employee>(){@OverridepublicEmployeeget(){returnnewEmployee();}};//Lambda写法Suppliersup1=()->newEmployee();//构造函数参考写法//Tget()inSupplier//Employee的空参数构造函数:Employee()Suppliersup2=Employee::new;}//Lambda写法Functionfunc1=id->newEmployee(id);//构造函数参考写法//RinFunctionapply(Tt)Functionfunc2=Employee::new;//Lambda写法BiFunctionfunc1=(id,name)->newEmployee(id,name);//构造函数参考写法//RinBiFunctionapply(Tt,Uu)BiFunctionfunc2=Employee::new;7.数组引用数组引用的格式:type[]:newpublicstaticvoidmain(String[]args){Functionfunction=String[]::new;String[]apply=function.apply(5);System.out.println(apply.length);}//Result58.Lambda表达式的作用域Lambda表达式可以看作是匿名内部类实例化的对象,Lambda表达式的访问限制和匿名变量因此,Lambda表达式可以访问局部变量、局部引用、静态变量和实例变量。8.1访问局部变量可以在lambda表达式中直接访问外部局部变量publicstaticvoidmain(String[]args){finalintnum=1;//也可以声明为final//intnum=1;ConverterstringConverter=(from)->String.valueOf(from+num);stringConverter.convert(2);}//结果38.2访问对象字段、静态变量和局部变量的区别在于实例的字段(即:成员变量)和Lambda内部的静态变量都是可读可写的。导入org.springframework.core.convert.converter.Converter;publicstaticvoidmain(String[]args){Lambda4lambda4=newLambda4();lambda4.testScopes();}classLambdaTest{staticintmyStaticNum;intmyNum;voidtestScopes(){ConverterstringConverter1=(from)->{outerNum=23;返回String.valueOf(from);};字符串转换=stringConverter1.convert(1);System.out.println("整数转换字符串结果"+convert);ConverterstringConverter2=(from)->{outerStaticNum=72;返回String.valueOf(from);};字符串convert2=stringConverter2.convert(2);系统输出。println("整数转换字符串结果"+convert2);}}//ResultIntegerconversionStringresult1IntegerconversionStringresult29.Summaryjava8新特性lambda表达式知识总结文章介绍到这里,这里列举一些例子,仅供参考,仅供参考用作学习笔记。欢迎批评指正。有兴趣的可以关注程序自己的微信订阅号