Java核心技術之Java8新特性-Lambda運算式,java8-lambda
1 總體說明
Java8新特性概述
函數式介面
Lambda運算式(閉包)
2 Java8新特性概述
Oracle公司於2014年3月發布了Java8正式版,該版本是自JDK5.0以來最具革命性的版本。
Java8為Java語言、編譯器、類庫和JVM帶來了大量的新特性。接下來的內容將會詳細說明Java8在Java語言方面的新特性以及它們的使用情境。
3 函數式介面
Java8引入的一個核心概念是函數式介面(Functional Interfaces):如果一個介面定義一個唯一的抽象方法,那麼這個介面就是函數式介面。同時引入一個新註解:@FunctionalInterface,在函數式介面上方使用該註解聲明此介面為函數式介面,也就意味著該介面只能有唯一的抽象方法。
線上程的建立時通常都採用實現Runnable介面,然後重寫抽象的run方法來定義線程任務。該介面就是一個函數式介面.
@FunctionalInterface //函數式介面註解,此介面中不能添加其他抽象方法public interface Runnable { /*該方法由子類實現,定義線程執行的商務邏輯*/ public abstract void run();}
那麼問題來了,函數式介面有啥用呢? 請看下面的Lambda運算式
4 Lambda運算式(閉包)
函數式介面的重要屬性:可以使用Lambda執行個體化它們。
Lambda的引入給開發人員帶來不少的好處:在Java8之前,匿名內部類,監聽器和事件處理器的使用都顯得很冗長,代碼可讀性很差,Lambda運算式的應用則使得代碼變得更加緊湊,可讀性增強。(前提條件是你要理解Lambda運算式寫法的含義)而且Lambda運算式使得並行操作大集合變得很方便,可以充分發揮多核CPU的優勢,更易於為多核處理器編寫代碼;
4.1 Lambda運算式的組成
第一部分:一個括弧內用逗號分隔的形式參數,參數是函數式介面方法裡的參數。
第二部分:為一個箭頭符號:->
第三部分:方法體,可以是運算式或者是代碼塊,如果方法體為運算式,該運算式的值作為傳回值返回,如果方法體為代碼塊,需要使用{}包裹起來,切需要一個return傳回值,但若函數式介面的方法傳回值為void,則無需傳回值。
Lambda表現形式為(parmeters) -> expression 或者 (parmeters) -> { statements; }
4.2 Lambda運算式的最佳實務:替換匿名內部類
下面使用Runnable介面為例,比較Lambda介面和匿名內部類的寫法
使用()->{}代替了匿名內部類
LambdaSample類中包含了兩個方法,分別是使用lambda運算式和匿名內部類計算1-10之間的偶數和,相對於匿名內部類而言,Lambda運算式更加簡潔。
package tony.javacore.jdk8.lambda;import static tony.javacore.util.io.PrintUtils.*;import java.util.concurrent.Executor;import java.util.concurrent.TimeUnit;/** * <p>Lambda運算式的使用和匿名內部類的對比</p> * @author tony 18616939520@163.com * @project_name JavaCore * @package_name tony.javacore.jdk8.lambda * @file_name LambdaSampleVSAnonymous.java * @see * @version 2015年9月6日下午9:36:49 * @since JDK8.0u45 */public class LambdaSampleVSAnonymous{ /** * 使用lambda運算式計算1-10之間的偶數和 * @version 2015年9月6日下午9:58:11 * @since */ public static void getSumWithLambda(){ Runnable runnable=()->{ println("使用lambda運算式建立runnable對象並計算1-10之間的偶數和"); int sum =0; for(int i=1;i<=10;i++){ if(i%2==0){ sum+=i; } } println("1-10之間的偶數和為 : "+sum); }; Thread thread =new Thread(runnable); thread.start(); //計算完畢之後暫停2秒鐘 try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } } /** * 使用匿名內部類計算1-10之間的偶數和 * @version 2015年9月6日下午10:00:31 * @since */ public static void getSumWithAnonymous(){ Runnable runnable =new Runnable() { @Override public void run() { println("使用匿名內部類式建立runnable對象並計算1-10之間的偶數和"); int sum =0; for(int i=1;i<=10;i++){ if(i%2==0){ sum+=i; } } println("1-10之間的偶數和為 : "+sum); } }; Thread thread =new Thread(runnable); thread.start(); } public static void main(String[] args) { getSumWithLambda(); getSumWithAnonymous(); }}/** * 使用lambda運算式建立runnable對象並計算1-10之間的偶數和 * 1-10之間的偶數和為 : 30 * 使用匿名內部類式建立runnable對象並計算1-10之間的偶數和 * 1-10之間的偶數和為 : 30 */
4.3 Lambda運算式最佳實務:遍曆常用資料結構
package tony.javacore.jdk8.lambda;import static tony.javacore.util.io.PrintUtils.*;import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Set;/** * <p>兩種遍曆集合的方式</p> * @author tony 18616939520@163.com * @project_name JavaCore * @package_name tony.javacore.jdk8.lambda * @file_name ForeachVSLambda.java * @see * @version 2015年9月10日 上午10:14:10 * @since JDK8.0u45 */public class ForeachVSLambda { /** * JDK1.5的foreach遍曆資料結構List的方式 * @param list */ public static void foreachCollection(Collection<String> collection){ for(String content:collection){ println("content : "+content); } } /** * 使用JDK1.8以後新增的預設方法forEach和lambda遍曆資料結構List * @param list */ public static void lambdaForEachCollection(Collection<String> collection){ collection.forEach((content )->{ println("content : "+content); }); } /** * foreach迴圈遍曆map * @param map */ public static void foreachMap(Map<String, Integer> map){ for(Map.Entry<String,Integer> entry:map.entrySet()){ println("key : "+entry.getKey() +" value : "+entry.getValue()); } } /** * 使用JDK1.8以後新增的預設方法forEach和lambda遍曆資料結構Map * @param map */ public static void lambdaForEachMap(Map<String, Integer> map){ map.forEach((key,value)->{ println("key : "+key +" value : "+value); }); } public static void main(String[] args) { List<String> list =new ArrayList<>(); list.add("Java"); list.add("Scala"); list.add("JPython"); foreachCollection(list); printFlag(); lambdaForEachCollection(list); Map<String, Integer> map =new HashMap<String, Integer>(); map.put("語文", 105); map.put("數學", 105); map.put("英語", 105); foreachMap(map); printFlag(); lambdaForEachMap(map); }}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。