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

Lambda表达式基础语法&自定义函数式接口

时间:2023-04-01 13:59:34 Java

目前学习Java应该主要使用Java8,或者说大部分企业目前都在使用Java8。现在Java8被广泛使用,肯定有一些亮点:Lambda表达式函数式接口方??法引用和构造函数引用StreamAPI接口中的默认方法和静态方法新的时间和日期API其他新特性更快的速度和更干净的代码Less(新语法Lambda表达式添加),强大的StreamAPI,易于并行化,最小化空指针异常可选。2、为什么要用Lambda表达式?Lambda是一个匿名函数号,我们可以把一个Lambda表达式理解为一段可以传递的代码(像传递数据一样传递代码)。您可以编写更简洁、更灵活的代码。作为一种更紧凑的编码风格,Java语言的表现力得到了提升。3.Lambda表达式的基本语法Lambda表达式在Java语言中引入了新的语法元素和运算符。这个运算符是“->”,这个运算符被称为Lambda运算符或剪枝运算符。它将Lambda分为两部分:Left:指定Lambda表达式所需的所有参数。右侧:指定Lambda主体,即Lambda表达式要执行的功能。有关详细信息,请参见下面的代码示例。packagecom.szh.java8;importorg.junit.Test;importjava.util.Comparator;importjava.util.function.Consumer;/**Lambda表达式的基本语法:Java8引入了一个新的运算符"->"此运算符称为箭头运算符或Lambda运算符。箭头运算符将Lambda表达式拆分为两部分:*左:Lambda表达式的参数列表右:Lambda表达式中要执行的函数,即Lambda主体*Lambda表达式需要“函数式接口”的支持函数式接口:接口中只有一个抽象方法的接口,称为函数式接口可以用注解@FunctionalInterface修饰,可以判断是否为函数式接口*/publicclassMyTest2{/***语法格式一:无参数,无返回值*()->System.out.println("HelloWorld!!!");*/@Testpublicvoidtest1(){Runnabler1=newRunnable(){@Overridepublicvoidrun(){System.out.println("HelloWorld!!!");}}};----r1.run();----------------------");Runnabler2=()->System.out.println("HelloWorld!!!");r2.run();}}packagecom.szh.java8;importorg.junit.Test;importjava.util.Comparator;importjava.util.function.Consumer;/**Lambda表达式的基本语法:Java8引入一个新的运算符“->”这个运算符叫做箭头运算符或者Lambda运算符箭头运算符将Lambda表达式拆分为两部分:*左:Lambda表达式的参数列表右:Lambda表达式中要执行的函数Lambdabody*Lambda表达式需要“函数式接口”的支持函数式接口:接口中只有一个抽象方法的接口称为函数式接口可以用注解@FunctionalInterface修饰,可以查看是否是函数式interface*/publicclassMyTest2{/***语法格式2:一个参数,无返回值*(x)->System.out.println(x)*这种语法格式可以省略括号,等同于*x->System.out.println(x)*/@Testpublicvoidtest2(){Consumerconsumer=(str)->System.out.println(str);consumer.accept("Lambda表达式太好用了....");}}packagecom.szh.java8;importorg.junit.Test;importjava.util.Comparator;importjava.util.function.Consumer;/**Lambda表达式公式的基本语法:Java8引入了一个新的运算符"->”这个运算符叫做箭头运算符或者Lambda运算符箭头运算符把Lambda表达式分成两部分:*左边:Lambda表达式右边的参数列表:Lambda表达式中要执行的函数,即,Lambdabody*Lambdaexpression需要“函数式接口”的支持函数式接口:接口中只有一个抽象方法的接口,称为函数式接口可以使用注解@FunctionalInterface来判断是否是函数式接口*/publicclassMyTest2{/***语法格式3:有两个以上的参数和一个返回值,并且Lambda主体中有多个语句*/@Testpublicvoidtest3(){Comparatorcomparator=(x,y)->{System.out.println("Functionalinterface....");返回整数.compare(x,y);};}}packagecom.szh.java8;importorg.junit.Test;importjava.util.Comparator;importjava.util.function.Consumer;/**Lambda表达式基础语法:Java8引入了一个新的运算符“->”这个运算符称为箭头运算符或Lambda运算符箭头运算符将Lambda表达式分为两部分:*左侧:Lambda表达式的参数列表右侧:Lambda表达式中要执行的函数,即Lambda主体*Lambda表达式需要“函数式接口”的支持函数式接口:接口中只有一个抽象方法的接口,称为函数式接口注解@可以使用FunctionalInterface修饰,可以查看是否是函数式接口*/publicclassMyTest2{/***语法格式4:如果Lambda体中只有一条语句,*那么return和大括号可以省略*Lambda表达式的参数列表数据类型可以省略,*因为JVM编译器会推断出通过上下文的数据类型,即“类型推断”*/@Testpublicvoidtest4(){Comparatorcomparator=(x,y)->Integer.compare(x,y);}}上述lambda表达式中的参数类型都是由编译器推断出来的。不需要在lambda表达式中指定类型,程序仍然可以编译,因为java训练是基于程序的上下文,参数的类型是在幕后推导出来的。lambda表达式的类型取决于上下文并由编译器推断。这称为“类型推断”。4、带有自定义函数式接口且只包含一个抽象方法的接口称为函数式接口。您可以通过Lambda表达式创建此接口的对象。(如果Lambda表达式抛出一个checkedexception,那么需要在目标接口的抽象方法上声明该异常)我们可以在任何函数式接口上使用@FunctionalInterface注解,这样我们就可以检查它是否是一个函数式接口interface,并且javadoc还将包含该接口是功能接口的声明。和Runnable接口一样,是典型的函数式接口。@FunctionalInterfacepublicinterfaceRunnable{/***当使用实现接口{@codeRunnable}的对象*来创建线程时,启动线程会导致对象的*{@coderun}方法在单独执行的*线程中被调用。*

*{@coderun}方法的一般约定是它可以*采取任何行动。**@seejava.lang.Thread#run()*/publicabstractvoidrun();}那么我们肯定可以自定义函数式接口,首先是没有泛型的自定义函数式接口。packagecom.szh.java8.two;/****/@FunctionalInterfacepublicinterfaceMyFunction{publicStringgetValue(Stringstr);}packagecom.szh.java8.two;/****/publicclassTestLambda{privatestaticStringstrHandler(Stringstr,MyFunctionmf){returnmf.getValue(str);}publicstaticvoidmain(String[]args){//去除前后空格StringtrimStr=strHandler("\t\t\t张起灵-萧哥",(str)->str.trim());System.out.println(trimStr);//转大写StringupperStr=strHandler("helloworld",str->str.toUpperCase());系统.out.println(upperStr);//部分截取StringnewStr=strHandler("学习Java",(str)->str.substring(0,5));System.out.println(newStr);让我们看一下带有泛型的函数式接口。packagecom.szh.java8.three;/****/@FunctionalInterfacepublicinterfaceMyFunction2{publicRgetValue(Tt1,Tt2);}packagecom.szh.java8.three;导入com。szh.java8.two.MyFunction;/****/publicclassTestLambda{privatestaticvoidoperation(Longl1,Longl2,MyFunction2mf){System.out.println(mf.getValue(l1,l2));}publicstaticvoidmain(String[]args){//andoperation(100L,200L,(x,y)->x+y);//乘积运算(300L,500L,(x,y)->x*y);}}将Lambda表达式作为参数传递:为了将Lambda表达式作为参数传递,接收Lambda表达式的参数类型必须是与Lambda表达式兼容的函数式接口类型。