Java核心技術之Java8新特性-Lambda運算式,java8-lambda

來源:互聯網
上載者:User

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);    }}

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.