Java 8 新特性 - lambda表達式理解的簡單實例
作用:
簡化了內部匿名類的寫法,通常回調都是以這種方式來實現。
可以使用lambda表達式接口舉例:
如:reids 的回調函數
package org.springframework.data.redis.core;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.lang.Nullable;
public interface RedisCallback<T> {
@Nullable
T doInRedis(RedisConnection connection) throws DataAccessException;
}
Runable接口:
package java.lang;
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
第一種方式:手寫實例展示
使用lambda表達式的條件是:接口,並且該接口只有一個抽象方法
抽象方法沒有參數的就以()-> 來表示
//單抽象方法的接口
public interface LambdaIntf{
void test(String str);
}
//常規實現內部匿名接口的方法
public static void main(){
public static void main(String[] args) {
LambdaIntf i = new LambdaIntf() {
@Override
public void say(String str) {
System.out.println( str);
}
};
i.say("hello lambda");
}
}
//lambda表達式
public static void main(String[] args) {
LambdaIntf i =(str)->{
System.out.println(str);
};
i.say("hello lambda");
}
LambdaIntf i =(str)->{System.out.println(str);};
兩點;省略了str的參數類型,系統可以自動推斷出來。省略了抽象方法的生命,直接寫方法體的內容
第二種方式:
以 Runablle 接口爲例:
public class TestLamb{
public static void main(String[] args) {
//調用下面的方法
Thread t = new Thread(TestLamb::myrun);
t.start();
}
//靜態方法,這種表示方式和 工具類的調用相似
private static void myrun() {
String name = Thread.currentThread().getName();
try {
Thread.currentThread().sleep(1000);
System.out.println("完成");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
常見錯誤:
lambda expression art not supported at language level ‘6’
我自己在運行的時候,出現這個錯誤。在 idea 中:
1.File – > project structure -->Project
project SDK(設置項目的jdk版本) : 一定選擇的是jdk1.8以上;
project language level :設置爲 8 -Lambdas ,type annitations etc. 的選項
2.File --> project structure --> Modules
source:設置language level 也爲 8 -Lambdas ,type annitations etc.