雖然目前Java最新版本都已經(jīng)到16了,但是絕大部分公司目前用的Java版本都是8,想當初Java8問世后,其Lambda表達式與方法引用可是最亮眼的新特性,目前,這兩個特性也被大家廣泛使用,所以今天指北君就帶大家看看這兩個特性
1.Lambda
從JDK1.8開始為了簡化使用者進行代碼開發(fā),專門提供有Lambda表達式的支持,利用此操作形式可以實現(xiàn)函數(shù)式的編程,對于函數(shù)式編程比較著名的語言:haskell,Scala,利用函數(shù)式的編程可以避免掉面向?qū)ο缶幊讨械囊恍┓爆嵉膯栴}。面向?qū)ο笤谄溟L期發(fā)展的過程中一直有一部分的反對者認為面向?qū)ο筮^于繁瑣
比如:
public interface IMessage {
public void send(String str);
}
public class Demo {
public static void main(String args[]){
IMessage msg = new IMessage() {
@Override
public void send(String str) {
System.out.println("消息發(fā)送:"+str);
}
};
msg.send("hahahaha");
}
}
上面語句的核心功能只有一行核心語句,但是為了這一行核心語句依然需要按照完整的面向?qū)ο蠼o出的設計結(jié)構進行開發(fā)。所以Lambda出現(xiàn)啦。
public interface IMessage {
public void send(String str);
}
public class Demo {
public static void main(String args[]){
IMessage msg = (str)- >{
System.out.println("發(fā)送消息:"+str);
};
msg.send("hahahaha");
}
}
簡單吧,這種形式就避免了復雜的面向?qū)ο蠼Y(jié)構化的要求。
Lambda表達式如果要想使用,那么必須有一個重要的實現(xiàn)要求:SAM(Single Abstract Method)只有一個抽象方法( 但可以有default和static方法 ),以IMessage接口為例,在這個接口里面發(fā)現(xiàn)只是提供有一個send()方法,除此之外沒有任何其他方法定義,所以這樣的接口就被稱為 函數(shù)式接口 ,而只有函數(shù)式接口才可以被Lambda表達式所使用
jdk1.8之后可以在接口里面定義static方法和default方法也是為了函數(shù)式編程而設置的,如下面這個是允許的
public interface IMessage {
public void send(String str);
public default void defaultMethod(){
System.out.println("hahahaha");
};
}
public class Demo {
public static void main(String args[]){
IMessage msg = (str)- >{
System.out.println("發(fā)送消息:"+str);
};
msg.send("hahahaha");
msg.defaultMethod();
}
}
對于Lambda表達式而言,提供了如下幾種格式
1) 方法沒有參數(shù):()-->{ };
2) 方法有參數(shù):(參數(shù),參數(shù))-->{ };
- 如果現(xiàn)在只有一行語句返回:(參數(shù),參數(shù))-->語句;
我們看下第三種
public interface IMath {
public int add(int x,int y);
}
public class Demo {
public static void main(String args[]){
IMath math = (t1,t2) - > t1 + t2;
System.out.println(math.add(10,20));
}
}
利用Lambda表達式可以使代碼更加簡便
其中一個很經(jīng)典的應用就是多線程Runnable接口的例子
public class Test{
public static void main(String[] args) {
/*
匿名內(nèi)部類的方式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("nihao");
}
}).start();
System.out.println("你好");
*/
//lambda的方式
new Thread(()- > {
for(int i = 1 ; i< 100 ; i++){
System.out.println("It is a lambda function!");
}
}).start();
}
}
2.方法引用
引用數(shù)據(jù)類型最大的特點是可以進行內(nèi)存的指向處理,但是在傳統(tǒng)的開發(fā)之中一直所使用的只是對象引用操作,而jdk1.8以后也提供有方法的引用,即:不同的方法名稱可以描述同一個方法(即可以為一個方法定義多個名字,但是要求必須是函數(shù)式接口)。如果要進行方法的引用在java里面提供了如下的四種形式
1)引用靜態(tài)方法:類名稱 :: static方法名稱;
2)引用某個實例對象的方法:實例化對象 :: 普通方法;
3)引用特定類型的方法:特定類 :: 普通方法;
4)引用構造方法:類名稱 :: new ;
2.1 引用靜態(tài)方法 :
在String類里面提供有String.valueOf( )方法,這個方法就屬于靜態(tài)方法。
方法范例:public static String valueOf(int i),該方法有參數(shù)還有返回值
@FunctionalInterface //函數(shù)式接口
public interface IFunction< P,R > {
public R change(P p); //p描述的是參數(shù),R描述的是返回值
}
public class Demo {
public static void main(String args[]){
IFunction< Integer , String > fun = String :: valueOf;
String str = fun.change(100);
System.out.println(str.length());
}
}
輸出結(jié)果為:3
2.2 引用某個實例對象的方法
String類里面有個轉(zhuǎn)大寫的方法:public String toUpperCase( )
這個方法是必須在有實例化對象提供的情況下才可以調(diào)用
@FunctionalInterface //函數(shù)式接口
public interface IFunction< R > {
public R upper();
}
public class Demo {
public static void main(String args[]){
IFunction< String > fun = "hahaha" :: toUpperCase; //"hahaha"為String的實例化對象
System.out.println(fun.upper());
}
}
輸出結(jié)果為:hahaha
2.3 引用特定類型的方法
在方法引用時也可以引用特定類中的一些操作方法,在String里面提供有一個字符串大小關系的比較
比較大?。簆ublic int compareTo(String anotherString)
這是一個普通方法,如果要引用普通方法,則往往都需要實例化對象,但是如果說現(xiàn)在你不想給出實例化對象,只是想引用這個方法,則就可以使用特定類來進行引用處理。
@FunctionalInterface //函數(shù)式接口
public interface IFunction< P > {
public int compare(P p1,P p2);
}
public class Demo {
public static void main(String args[]){
IFunction< String > fun = String :: compareTo ; //String類中的conpareTo方法
System.out.println(fun.compare("A","a"));
}
}
輸出結(jié)果為:-34
2.4 引用構造方法
public class Person {
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String toString(){
return "姓名:" + this.name + "、年級:" + this.age ;
}
}
@FunctionalInterface //函數(shù)式接口
public interface IFunction< R > {
public R create(String s ,int a);
}
public class Demo {
public static void main(String args[]){
IFunction< Person > fun = Person :: new ; //String類中的conpareTo方法
System.out.println(fun.create("張三",20));
}
}
輸出結(jié)果:姓名:張三、年級:20
提供方法引用的概念更多情況下也只是彌補了對于引用的支持功能。
3 小結(jié)
本文介紹了Java8的新特性,lambda和方法引用,其為我們編程帶來了便利,所以我們應該需要掌握它。
-
JAVA
+關注
關注
19文章
2970瀏覽量
104814 -
編程
+關注
關注
88文章
3619瀏覽量
93782 -
函數(shù)
+關注
關注
3文章
4333瀏覽量
62700 -
Lambda
+關注
關注
0文章
29瀏覽量
9889
發(fā)布評論請先 登錄
相關推薦
評論