1. 程式人生 > >初識Lambda表示式----java

初識Lambda表示式----java

寫在前面的話

    終於還是換了新的工作,比起原來每天早上8:00上班晚上12點多才回宿舍的日子,現在真的幸福的不止一點半點。但真正讓我最開心的是公司裡有很多的大牛,也用了很多的新技術,而現在我也有相對比較充足的時間去給自己充電,希望自己能夠通過不懈的努力更快的成為一個大牛。

首先我想啃的是lambda表示式。

首先看如下程式碼:
package com.nrsc.lambda;
interface Interface1 {
    int calculate(int i);
}
class Test implements Interface1 {
    @Override
    public
int calculate(int i) { System.out.println("-----繼承----"); return i * 2 + 4; } } public class LambdaDemo1 { public static void main(String[] args) { Interface1 test = new Test(); int value = test.calculate(3); System.out.println(value); } }

   執行結果如下:
在這裡插入圖片描述


   上面的程式碼很簡單,就是有一個類Test繼承了一個介面Interface1 並實現了Interface1內的calculate方法,然後在LambdaDemo1 類中new一個Test類就可以完成對該方法的呼叫。

再看一下lambda表示式與上面方式的對比
package com.nrsc.lambda;

interface Interface1 {
    int calculate(int i);
}
class Test implements Interface1 {
    @Override
    public int calculate(int i) {
        System.
out.println("-----繼承----"); return i * 2 + 4; } } public class LambdaDemo1 { public static void main(String[] args) { Interface1 test = new Test(); int value = test.calculate(3); System.out.println(value); System.out.println("=========割========"); /** * Lambda表示式 */ Interface1 i1 = (i) -> i * 1; //與繼承的方式進行對比可以知道lambda表示式中 // "->"左邊是介面中方法需要輸入的引數, // "->"右邊是繼承了該介面的類對介面中定義方法的一個具體實現 // 而"="號右邊所有的內容加起來就是構建了一個實現了Interface1介面的例項(多型) int i1Value = i1.calculate(3); //返回值型別就是介面內方法的返回值型別 System.out.println(i1Value); } }
lambda表示式還有如下幾種書寫方式
package com.nrsc.lambda;
//@FunctionalInterface為一個編譯註解--標誌本介面為函式式介面,不寫也不會報錯
//但建議能加的時候還是加上
//這裡有一個注意點,假如加上了該註解,那麼這個介面就必須有一個未實現的方法
//否則會包編譯錯誤 No target method found
@FunctionalInterface
interface Interface1 {
    int calculate(int i);
    // int add(int i, int j); //@FunctionalInterface會報編譯錯誤,因為被此註解標註的介面,只能有一個未實現的方法
}
class Test implements Interface1 {
    @Override
    public int calculate(int i) {
        System.out.println("-----繼承----");
        return i * 2 + 4;
    }
}
public class LambdaDemo1 {
    public static void main(String[] args) {
        Interface1 test = new Test();
        int value = test.calculate(3);
        System.out.println(value);
        System.out.println("=========割========");

        //與繼承的方式進行對比可以知道lambda表示式中
        //      "->"左邊是介面中方法需要輸入的引數,
        //      "->"右邊是繼承了該介面的類對介面中定義方法的一個具體實現
        //      而"="號右邊所有的內容加起來就是構建了一個實現了Interface1介面的例項(多型)
        /**
         * Lambda表示式常見寫法如下
         */
        Interface1 i1 = (i) -> i * 1;

        Interface1 i2 = i -> i * 2 + 1;  //比較簡單且常見的寫法

        Interface1 i3 = (int i) -> i * 3 + 2;
        //前三種方式預設有一個return,下面這種方式可以顯示寫出要return的內容
        //並且還可以有一些中間操作,如下面的輸出語句
        Interface1 i4 = i -> {
            System.out.println("---------");
            return i * 4 + 3;
        };

        int i1Value = i1.calculate(3);  //返回值就是介面內方法的返回值
        System.out.println(i1Value);
        System.out.println(i2.calculate(2));
        System.out.println(i3.calculate(2));
        System.out.println(i4.calculate(2));
    }
}

注意

   Interface1介面上的註解@FunctionalInterface,它放在某個介面上的話,該介面只能有一個未實現的方法(java官方鼓勵一個介面只幹一件事),但是還可以有一些預設實現的方法,如下:

package com.nrsc.lambda;

//@FunctionalInterface為一個編譯註解--標誌本介面為函式式介面,不寫也不會報錯
//但建議能加的時候還是加上
@FunctionalInterface
interface Interface2 {
    int calculate(int i);

    // int add(int i, int j); //@FunctionalInterface會報編譯錯誤,因為被此註解標註的介面,只能有一個未實現的方法

    //但是函式式介面可以有一個或多個預設實現的方法,如下:
    default int plus(int x, int y) {
        System.out.println("預設方法加");
        return x + y;
    }

    default int minus(int x, int y) {
        System.out.println("預設方法減");
        return x - y;
    }
}

public class LambdaDemo2 {

    public static void main(String[] args) {
        Interface2 i1 = i -> i * 3;

        System.out.println(i1.minus(5, 4));
        System.out.println(i1.plus(5, 4));
        System.out.println(i1.calculate(5));
    }
}
   還有一個知識點需要補充一下,當兩個函式式介面都預設實現了某個方法時(如plus),如果第三個介面想繼承這兩個介面時,必須得指定要繼承哪個介面的預設實現方法,當然它也可以重新實現這個預設方法.
package com.nrsc.lambda;

//@FunctionalInterface為一個編譯註解--標誌本介面為函式式介面,不寫也不會報錯
//但建議能加的時候還是加上
@FunctionalInterface
interface Interface11 {
    int calculate(int i);

    //但是函式式介面可以有一個或多個預設實現的方法,如下:
    default int plus(int x, int y) {
        System.out.println("預設方法加");
        return x + y;
    }
}

@FunctionalInterface
interface Interface12 {
    int calculate(int i);

    //但是函式式介面可以有一個或多個預設實現的方法,如下:
    default int plus(int x, int y) {
        System.out.println("預設方法加");
        return x + y;
    }
}

@FunctionalInterface
interface Interface13 extends Interface11, Interface12 {
    //int minus (int i); //---- 如果加上這句話肯定也會報錯,因為FunctionalInterface標註的類只能有一個未實現的方法
    //---- 而且假如Interface11和Interface12中未實現的方法(calculate)不是一個,肯定也會報錯

    //如果繼承的兩個接口裡有相同的預設方法的話,必須得選擇繼承哪一個的
    @Override
    default int plus(int x, int y) {
        return Interface11.super.plus(x, y);
    }

    //下面這種方式也可以
/*    @Override
    default int plus(int x, int y) {
        return x + y;
    }*/
}

public class LambdaDemo3 {

    public static void main(String[] args) {
        Interface13 i1 = i -> i * 3;
        System.out.println(i1.plus(5, 4));
        System.out.println(i1.calculate(5));
    }
}

相關推薦

初識Lambda表示式----java

寫在前面的話     終於還是換了新的工作,比起原來每天早上8:00上班晚上12點多才回宿舍的日子,現在真的幸福的不止一點半點。但真正讓我最開心的是公司裡有很多的大牛,也用了很多的新技術,而現在我也有相對比較充足的時間去給自己充電,希望自己能夠通過不懈的努力更快

初識Lambda表示式1----java

寫在前面的話     終於還是換了新的工作,比起原來每天早上8:00上班晚上12點多才回宿舍的日子,現在真的幸福的不止一點半點。但真正讓我最開心的是公司裡有很多的大牛,也用了很多的新技術,而現在我也有相對比較充足的時間去給自己充電,希望自己能夠通過不懈的努力更快的成為

初識Lambda表示式2(JDK提供的函式式介面的引出)----java

一個小栗子    為了更加深刻的理解lambda表示式,寫了如下一個栗子: package com.nrsc.lambda.MoneyDemo; import java.text.DecimalFormat; @FunctionalInterface inte

初識Lambda表示式3----JDK提供函式式介面的引出2---java

寫在前面的話     總感覺上篇部落格有些東西需要補充,於是思來想去寫下了本篇部落格… 1.場景引入     場景: 假如有這樣一種場景,我們的專案裡有好多方法,這些方法的引數都包含一個介面,這些介面雖然其功能各不相同,但是卻都有一個共同點

Java函數語言程式設計:初識Lambda表示式

一,Lambda表示式 隨著多核CPU和大資料的流行,為了寫出在多核CPU上執行良好的程式 人們開發出了java.util.concurrent包和很多第三方類庫,試圖將併發抽象化 面對大型資料集合,java還欠缺高效的並行操作,開發者能夠使用java8編寫複雜

lambda表示式 java.lang.ArrayIndexOutOfBoundsException: 54295

Caused by: java.lang.ArrayIndexOutOfBoundsException: 54295 at org.springframework.asm.ClassReader.<init>(Unknown Source) at org.springfram

lambda表示式 java.lang.ArrayIndexOutOfBoundsException: 54295

Caused by: java.lang.ArrayIndexOutOfBoundsException: 54295 at org.springframework.asm.ClassReader.<init>(Unknown Source) at

JDK8學習筆記(一)初識lambda表示式

       這幾天又學習了一遍關於jdk8中lambda表示式,以前也看過一遍,由於沒怎麼用過,只是看別人程式碼時用過lambda,也沒有做筆記,時間一長就忘的差不多了。為了吸取教訓,這次看了後,做下筆記,供以後參考學習。     j

初探Lambda表示式-Java多核程式設計【0】從外部迭代到內部迭代

開篇 放假前從學校圖書館中借來一本書,Oracle官方的《精通Lambda表示式:Java多核程式設計》。 假期已過大半才想起來還沒翻上幾頁,在此先推薦給大家。 此書內容簡潔幹練,如果你對Java語法有基礎的認識看起來就會不費勁,唯一的缺點就是程式碼部分的內容以及排版有些錯

在 Eclipse IDE 中試用 Lambda 表示式 Java

學習如何充分利用 lambda 和虛擬擴充套件方法。 2013 年 8 月釋出 Lambda 表示式也稱為閉包,是匿名類的簡短形式。Lambda 表示式簡化了單一抽象方法宣告介面的使用,因此 lambda 表示式也稱為功能介面。在 Java SE 7 中,單一方法介面可使

快速瞭解Lambda表示式-Java

目錄 lambda表示式 前言 簡介 簡單入門 用法 好處 總結 lambda表示式 前言 最

用Intellj idea來運行javalambda表示式的一些配置

java版 courier ttl supported jdk1.8 自己 inf tel etc 今天復習的時候看到Java8的新特性,看到了Java也可以使用lambda,原諒我的愚昧無知…… 於是自己也決定動手去試一下lambda表達式在Java中的應用,但是,在做一

java學習筆記(十)-- java新特性 (列舉 & 註解 & 介面定義加強 & Lambda表示式

列舉 (enum) 高階的多例模式 java中列舉使用enum關鍵字定義列舉 列舉就是一種多例設計模式 enmu Color{     RED,BLUE,GREEN;     } enum Color{

Java Builder模式 Lambda表示式 Java8 lambda表示式10個示例

Java Builder模式 package com.cathay;/** * @Description * @TODO * @Author [email protected] * @Date 建立時間:2018/11/16 **/public class Person { private

java函數語言程式設計——Lambda表示式

函數語言程式設計 很多開發語言都開始支援函數語言程式設計,其中最具備代表性的就是haskell。函數語言程式設計和麵向物件程式設計可以理解為兩大開發陣營。 在函數語言程式設計中,所有的資料都是不可變的,不同的函式之間通過資料流來交換資訊,函式享有跟資料一樣的地位,可以作為引數傳遞給下一個函式

Java 8新特性—02.Lambda 表示式基礎語法

Lambda 表示式的基礎語法:Java8中引入了一個新的操作符“->” 該操作符稱為箭頭操作符或Lambda操作符, 該操作符將Lambda表示式拆分為兩部分: 左側:Lambda 表示式的引數部分 右側:Lamdba 表示式中所需執行的功能,即Lambda 體。

Java 常用Lambda表示式

map reduce 這個方法的主要作用是把 Stream 元素組合起來。它提供一個起始值(種子),然後依照運算規則(BinaryOperator),和前面 Stream 的第一個、第二個、第 n 個元素組合。從這個意義上說,字串拼接、數值的 sum、min、max、averag

idea中java: -source 1.5 中不支援 multi-catch語句 或不支援 lambda 表示式

一、在idea中出現如下錯誤 Error:(27, 35) java: -source 1.5 中不支援 multi-catch 語句 (請使用 -source 7 或更高版本以啟用 multi-catch 語句) 解決辦法: 在idea中重新設定 File ->Proj

Java 8 Lambda 表示式(一)

Java 8 新特性  Lambda 表示式,也可稱為閉包,它是推動 Java 8 釋出的最重要新特性。  Lambda 允許把函式作為一個方法的引數(函式作為引數傳遞進方法中)。  使用 Lambda 表示式可以使程式碼變的更加簡潔緊湊   &nbs

JAVA筆記四:介面、lambda表示式與內部類

一、介面 1.1介面的概念 介面不是類,而是對類的一組需求描述 ,介面所有方法自動為public,當然在定義介面的時候加上也不違反語法規則。 java.lang.Comparable<T>1.0 int compareTo(T other) //小於other則返回負