一、Lambda表达式介绍Lambda表达式是Java8最重要的新特性之一。使用Lambda表达式可以代替只有一个抽象函数的接口实现,告别匿名内部类,代码看起来更简洁易懂。Lambda表达式还改进了在集合和框架上迭代、遍历和过滤数据的操作。Lambda表达式可以代替只有一个抽象函数的接口实现,告别匿名内部类。代码看起来更加简洁易懂。Lambda表达式还改进了集合和框架的迭代、遍历和过滤操作。Lambda可以大大提高减少代码冗余,代码的可读性优于冗长的内部类,匿名类例如我们使用匿名内部类来实现代码:Runnablerunnable=newRunnable(){@Overridepublicvoidrun(){System.out.println("running1....");}};runnable.run();使用lambda表达式实现更简洁的代码:Runnablerunnable3=()->System.out.println("running2....");runnable3。run();lambda表达式语法:LambdaParameters->LambdaBody此处插入图片描述args->expror(object...args)->{功能接口抽象方法实现逻辑}1.()参数的个数,根据函数类型接口中抽象参数的个数由抽象参数个数决定。只有一个参数时,()可以省略。2、当expr的逻辑很简单时,{}和return可以省略。案例说明:publicstaticvoidmain(String[]args)throwsException{Callablec1=newCallable(){@OverridepublicStringcall()throwsException{return"muxiaonong";}};System.out.println(c1.call());Callablec2=()->{return"muxiaonong2";};System.out.println(c2.call());//当逻辑很简单时,省略{}和returnCallablec3=()->"muxiaonong3";System.out.println(c3.call());}2.Lambda表达式的特点函数式编程参数类型自动推断,代码少,简洁3.Lambda表达式的实现方法列表:()->{}()->{System.out.println(1);}()->System.out.println(1)()->{return100;}()->100()->null(intx)->{returnx+1;}(intx)->x+1(x)->x+1x->x+1情况一:线程实现方法:publicstaticvoidmain(String[]args){//匿名内部类方法newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("runing1......");}});//Lambda表达式方法newThread(()->{System.out.println("runing2.....");}).start();}案例二:集合遍历实现publicstaticvoidmain(String[]args){Listlist=Arrays.asList("java","python","scala","javascript");//普通匿名内部类方法Collections.sort(list,newComparator(){@Overridepublicintcompare(Stringo1,Stringo2){returno1.length()-o2.length();}});//Lambda方法Collections.sort(list,(a,b)->a.length()-b.length());list.forEach(System.out::println);}四、Lambda表达式的应用场景重要说三times:凡是有函数式接口的地方*3什么是函数式接口:只有一个抽象方法(对象类中的方法除外)interface是一个函数式接口5.Lambda表达式的实际应用5.1无参数实体类模拟模拟数据库连接层:@FunctionalInterfacepublicinterfaceStudentDao{voidinsert(Studentstudent);}实体类/**@Authormxn*@DescriptionStudent实体类*@Date10:192020/11/7*@Param*@return**/publicclassStudent{}publicstaticvoidmain(String[]args){StudentDaosd1=newStudentDao(){@Overridepublicvoidinsert(Studentstudent){System.out.println("插入学生1");}};StudentDaosd2=(student)->{System.out.println("student:"+student);};StudentDaosd3=(Studentstudent)->System.out.println("student3:"+student);sd1。insert(newStudent());//输出insertstudent1sd2.insert(newStudent());//输出sd3.insert(newStudent());//输出}5.2参数实体类模拟实体类/**@Authormxn*@Description*@Date10:262020/11/7*@Param*@return**/publicclassTeacher{}接口模拟层@FunctionalInterfacepublicinterfaceTeacherDao{intget(Teacherteacher);}Impleme状态层publicstaticvoidmain(String[]args){TeacherDaotd1=newTeacherDao(){@Overridepublicintget(Teacherteacher){return1;}};TeacherDaotd2=(teacher)->{return2;};TeacherDaotd3=(Teacherteacher)->{return3;};TeacherDaotd4=(teacher)->4;TeacherDaotd5=(Teacherteacher)->5;System.out.println(td1.get(newTeacher()));//输出1System.out.println(td2.get(newTeacher()));//输出2System.out.println(td3.get(newTeacher()));//输出3System.out.println(td4.get(newTeacher()));//Output4System.out.println(td5.get(newTeacher()));//Output5}6.功能接口Supplier:代表一个输出Consumer:代表一个输入BiConsumer:代表两个输入Function:代表一个Input,一输出(一般输入输出不同类型)UnaryOperator:表示一输入一输出(输入输出类型相同)BiFunction:表示两输入一输出(一般输入输出不同类型)BinaryOperator:表示两个输入,一个输出(输入和输出是同一类型)在Java中提供了一系列函数接口来接受后续传入的逻辑,但是对输入输出有要求6.1Supplier:representativeAnoutputSuppliers1=()->{return"muxiaonong";};Suppliers2=()->"muxiaonong2";System.out.println(s1.get());//outputmuxiaonongSystem.out.println(s2.get());//outputmuxiaonong26.2Consumer:表示一个输入Consumerc11=(str)->System.out.println(str);c11.accept("beijing");//输出beijing6.3BiConsumer:代表两个输入BiFunction<String,String,Integer>bf=(a,b)->a.length()+b.length();System.out.println(bf.apply("祝你好运","今晚吃鸡"));//outputastringlength86.4Function:表示一个输入,一个输出//Function用于接收下面函数的实现,规定必须有一个输入(String)和一个output(Integer)Functionf1=(str)->{returnstr.length();};System.out.println(f1.apply("abcdefg"));//输出长度7七、方法referencemethodreference用于直接访问类或实例已有的方法或构造方法。方法引用提供了一种在不执行方法的情况下引用方法的方法。如果抽象方法的实现恰好是通过调用另一个方法来实现的,则可以使用方法引用7.1方法引用的分类7.2静态方法引用静态方法引用:如果函数式接口的实现恰好是通过调用静态方法实现的方法,那么可以使用静态方法引用/***@program:lambda*@ClassNameTest2*@description:*@author:muxiaonong*@create:2020-10-2822:15*@Version1.0**/publicclassTest2{//无参数静态方法staticStringput(){System.out.println("put.....");return"put";}//带参数的静态方法publicstaticvoidgetSize(intsize){System.out.println(size);}//带参数和返回值的静态方法publicstaticStringtoUpperCase(Stringstr){returnstr.toUpperCase();}//两个入参,一个返回值静态方法publicstaticIntegergetLength(Stringstr,Stringstr2){returnstr.length()+str2.length();}publicstaticvoidmain(String[]args){//无参数静态方法-正常调用System.out.println(put());//输出put//无参数static方法-原生调用Suppliers1=()->Test2.put();System.out.println(s1.get());//输出put//无参数静态方法-静态方法引用Suppliers2=Test2::put;System.out.println(s2.get());//输出put//无参数静态方法-内部类调用Suppliers3=Fun::hehe;System.out。println(s3.get());//输出呵呵//带参数的静态方法-静态方法参考Consumerc1=Test2::getSize;Consumerc2=(size)->Test2.getSize(size);c1.accept(123);c2.accept(111);//有参数和返回值的静态方法Functionf1=(str)->str.toUpperCase();Functionf2=(str)->Test2.toUpperCase(str);Functionf3=Test2::toUpperCase;Functionf4=Test2::toUpperCase;System.out.println(f1.apply("abc"));//输出ABCSystem.out.println(f2.apply("abc"));//输出ABCSystem.out.println(f3.apply("abc"));//输出ABCSystem.out.println(f4.apply("abc"));//输出ABC//二参数一返回值函数式接口BiFunctionbf=(a,b)->a.length()+b.length();BiFunctionbf2=Test2::getLength;System.out.println(bf2.apply("abc","def"));//输出6System.out.println(bf.apply("abc","def"));//输出6}//内部类classFun{publicstaticStringhehe(){return"hehe";}publicstaticStringtoUpperCase(Stringstr){returnstr.toUpperCase();}}}7.3实例方法参考实例方法参考:If函数式接口的实现恰好是通过调用实例的实例方法实现的,那么可以通过实例方法引用publicclassTest3{//实例没有参数的方法publicStringput(){return"put...";}//实例有参数方法publicvoidgetSize(intsize){System.out.println("size:"+size);}//实例有参数和返回值方法publicStringtoUpperCase(Stringstr){returnstr.toUpperCase();}publicstaticvoidmain(String[]args){//Instance无参数方法返回-正常调用System.out.println(newTest3().put());//输出put...Suppliers1=()->newTest3().put();Suppliers2=()->{returnnewTest3().put();};Suppliers3=newTest3()::put;System.out.println(s1.get());//输出put...System.out.println(s2.get());//输出put...System.out.println(s3.get()));//输出put...//只创建一个test3对象Test3test=newTest3();Consumerc1=(size)->newTest3().getSize(size);Consumerc2=newTest3()::getSize;Consumerc3=test::getSize;c1.accept(123);//输出大小:123c2.accept(123);//输出大小:123c3.accept(123);//输出大小:123Functionf1=(str)->str.toUpperCase();Functionf2=(str)->test.toUpperCase(str);Functionf3=newTest3()::toUpperCase;Functionf4=test::toUpperCase;System.out.println(f1.apply("abc"));//输出ABCSystem.out.println(f2.apply("abc"));//输出ABCSystem.out.println(f3.apply("abc"));//输出ABCSystem.out.println(f4.apply("abc"));//输出ABC}}7.4Objectmethodreference对象方法参考:抽象方法的第一个参数类型只是实例方法的类型,抽象方法的其余参数can只作为实例方法的参数如果功能接口的实现可以通过上面提到的实例方法调用来实现,那么可以使用对象方法引用/**@Authormxn*@Description//TODO对象方法引用*@Date14:262020/11/7*@Param*@return**/publicclassTest4{publicstaticvoidmain(String[]args){Consumerc1=(too)->newToo().foo();c1.accept(newToo());//输出fooConsumerc2=(Tootoo)->newToo2().foo();c2.accept(newToo());//输出foo---too2Consumerc3=Too::foo;c3.accept(newToo());//输出fooBiConsumerbc=(too2,str)->newToo2().show(str);BiConsumerbc2=Too2::show;bc.accept(newToo2(),"abc");bc2.accept(newToo2(),"def");BiFunctionbf1=(e,s)->newExec().test(s);bf1.apply(newExec(),"abc");BiFunctionbf2=Exec::test;bf2.apply(newExec(),"def");}}classExec{publicinttest(Stringname){return1;}}classToo{publicIntegerfun(Strings){return1;}publicvoidfoo(){System.out.println("foo");}}classToo2{publicIntegerfun(Strings){return1;}publicvoidfoo(){System.out.println("foo---too2");}publicvoidshow(Stringstr){System.out.println("show---too2"+str);}}7.5构造方法参考构造方法引用:如果函数式接口的实现恰好是通过调用类的构造函数实现的,那么可以使用构造函数参考/**@Authormxn*@Description//TODO构造方法参考*@Date14:272020/11/7*@Param*@return**/publicclassTest5{publicstaticvoidmain(String[]args){Suppliers1=()->newPerson();s1.get();//输出调用构造方法Suppliers2=Person::new;s2.get();//输出调用无参构造方法Suppliers3=ArrayList::new;Suppliers4=HashSet::new;Suppliers5=Thread::new;Suppliers6=String::new;Consumerc1=(age)->newAccount(age);Consumerc2=Account::new;c1.accept(123);//输出年龄参数构造123c2.accept(456);//输出年龄参数构造456Functionf1=(str)->newAccount(str);Functionf2=Account::new;f1.apply("abc");//输出str参数构造abcf2.apply("def");//输出str参数构造def}}classAccount{publicAccount(){System.out.println("调用无参构造方法");}publicAccount(intage){System.out.println("age参数构造"+age);}publicAccount(Stringstr){System.out.println("str参数构造"+str);}}classPerson{publicPerson(){System.out.println("调用不带参数的构造函数");}}8.总结Java8中引入Lambda表达式是为了接受的思想函数式编程语言,与指令式编程相比,函数式编程强调函数的计算比指令的执行更重要。Lambda表达式的引入是为了接受函数式编程语言的思想。执行很重要。Lambda表达式的引入是为了接受函数式编程语言的思想。与指令式编程相比,函数式编程强调函数的计算比指令的执行更重要。lambda表达式可以让代码看起来简洁,但是一定程度上增加了代码的可读性和调试的复杂度,所以在使用的时候,团队要尽量熟悉,否则不要使用根本没有,否则将难以维护。比较蛋疼的事情,今天的小知识就到这里了,有问题的朋友可以在下方留言,大家一起加油!