浅析Java8新特性Lambda表达式和函数式接口
什么是Lambda表达式,java8为什么使用Lambda表达式?
“Lambda表达式”(lambdaexpression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambdaabstraction),是一个匿名函数,即没有函数名的函数。我们可以把Lambda表达式理解为是一段可以传递的代码。最直观的是使用Lambda表达式之后不用再写大量的匿名内部类,简化代码,提高了代码的可读性。
//启动一个线程,不使用Lambda表达式 newThread(newRunnable(){ @Override publicvoidrun(){ System.out.println("启动一个线程"); } }).start(); //使用Lambda表达式,只需要一行代码 newThread(()->System.out.println("启动一个线程")).start();
Lambda表达式的基本语法和格式
基本语法
- java8中引入了新的操作符”->”,称为箭头操作符或者lambda操作符,箭头操作符将lambda拆分为两部分,左侧:lambda表达式的参数列表,右侧:lambda表达式中的所需要执行的的功能(接口实现的功能代码)。
- lambda表达式需要“函数式接口”的支持,接口中只有一个抽象方法的接口称为函数式接口,可以使用注解@FunctionalInterface检查接口是否是函数式接口。
- lambda表达式的参数列表的数据类型可以省略不写,因为jvm编辑器可以通过上下文判断。
- 基本格式
①无参数,无返回值。()->System.out.println(“hello”)
//实现Runnable接口(无参,无返回) Runnabler=()->System.out.println("hellolambda");
②一个参数(小括号可以省略不写,习惯上加上小括号),无返回值。(x)->System.out.println(x)
//Consumer接口(一个参数,无返回值),之后会提到 //第一种,小括号不省略 Consumerc=(x)->System.out.print(x); c.accept("hello"); //小括号省略 Consumer c1=x->System.out.print(x); c1.accept("hello")
③有多个参数,并且lambda有多条语句,则lambda语句必须用大括号括起来并有return返回(若有一条语句则可以省略大括号和return),有返回值。(x,y)->{System.out.println(“hello”);returnInteger.compare(x,y);};
//Comparator接口 //多条语句 Comparatorcomparator=(x,y)->{ System.out.println("hello"); returnInteger.compare(x,y); }; //一条语句 Comparator comparator2=(x,y)->Integer.compare(x,y); System.out.println(comparator2.compare(23,22));
还有其他的一些格式都是大同小异,这里就不再了解。
函数式接口是什么?
在前面也提到了函数接口,那么函数接口到底是什么呢?是个接口,只包含一个抽象方法,那么它就是函数式接口,我们可以在任意函数式接口上使用@FunctionalInterface检查它是否是一个函数式接口。
函数式接口里是可以包含默认方法、静态方法,他们不是抽象方法;也可以包含Java.lang.Object里的public方法,因为任何一个类都继承Object类,包含了来自java.lang.Object里对这些抽象方法的实现,也不属于抽象方法;函数式接口里允许子接口继承多个父接口,但每个父接口中都只能存在一个抽象方法,且必须的相同的抽象方法。
Java8内置函数式接口
四大核心函数式接口
//Consumer消费型接口 @Test publicvoidtest1(){ Consumer c=(x)->System.out.println("hello:"+x+"!"); c.accept("Java"); } //Supplier 供给型接口 @Test publicvoidtest2(){ Supplier s=()->"hello,beautifulgirl"; Stringstr=s.get(); System.out.println(str); } //Function 函数性接口 @Test publicvoidtest3(){ Function f=(x)->x.length(); Integerlen=f.apply("hello"); System.out.println(len); } //Predicate 断言型接口 @Test publicvoidtest4(){ Predicate p=(x)->x.length()>5; booleanb=p.test("helloJava"); System.out.println(b); }
其它函数式接口
总结
以上所述是小编给大家介绍的Java8新特性Lambda表达式和函数式接口,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!