国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java8新特性1——函數(shù)式接口&lambda表達式

這篇具有很好參考價值的文章主要介紹了Java8新特性1——函數(shù)式接口&lambda表達式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Java8新特性1——函數(shù)式接口&lambda表達式

注:以下內(nèi)容基于Java 8,所有代碼都已在Java 8環(huán)境下測試通過

目錄:

  • Java8新特性1——函數(shù)式接口&lambda表達式
  • Java8新特性2——方法引用
  • Java8新特性3——Stream

1. 函數(shù)式接口

如果在一個接口中,有且只有一個抽象方法,則該接口被稱為函數(shù)式接口。如:

interface Test {
    void test();
}

注:

可以在接口前使用 @FunctionalInterface 注解,判斷這個接口是否是?個函數(shù)式接口。如:

@FunctionalInterface
interface Test1 {//有且僅有一個抽象方法,是函數(shù)式接口
    void test();
}

@FunctionalInterface
interface Test2 {//有且僅有一個抽象方法,是函數(shù)式接口
    void test();

    default void f() {
    }
}

@FunctionalInterface
interface Test3 {//沒有抽象方法,不是函數(shù)式接口,編譯器報錯
}

@FunctionalInterface
interface Test4 {//有多個抽象方法,不是函數(shù)式接口,編譯器報錯
    void test1();

    void test2();
}

2. lambda表達式

2.1 lambda表達式作用

lambda表達式是一個匿名函數(shù),用于簡化函數(shù)式接口的實現(xiàn)。

在Java中,接口不能實例化,但接口對象可以指向?qū)崿F(xiàn)類對象。當(dāng)沒有實現(xiàn)類對象時,可以通過匿名類的方式,如:

public class Main {
    public static void main(String[] args) {
        Test test = new Test() {
            @Override
            public void f() {
                System.out.println("使用匿名函數(shù)的方式實現(xiàn)了函數(shù)式接口");
            }
        };
        test.f();
    }
}

@FunctionalInterface
interface Test {
    void f();
}

使用匿名類的方式代碼不是很簡潔,因此引入了lambda表達式,如:

public class Main {
    public static void main(String[] args) {
        Test test = () -> System.out.println("使用lambda表達式的方式實現(xiàn)了函數(shù)式接口");
        test.f();
    }
}

@FunctionalInterface
interface Test {
    void f();
}

在使用lambda表達式之后,代碼變得簡潔了很多,因此可以說lambda表達式是和函數(shù)式接口相輔相成的。在上面的代碼中,lambda表達式實際做了以下三個工作:

  1. 自動實現(xiàn)接口

    Test test = new Test();
    
  2. -> 前的參數(shù)自動添加到抽象函數(shù)里面(上面代碼中抽象函數(shù)沒有參數(shù))

    void f();
    
  3. -> 后的語句作為抽象函數(shù)的方法體

    void f(){
        System.out.println("使用lambda表達式的方式實現(xiàn)了函數(shù)式接口");
    }
    

2.2 lambda表達式語法格式

lambda表達式的格式如下:

(參數(shù)1, 參數(shù)2, ……) -> {
    方法體;
}

其中:

  • 參數(shù)要求和函數(shù)式接口中抽象方法的參數(shù)一致(包括數(shù)量和類型以及順序)
  • 如果函數(shù)式接口中抽象方法有返回值,則實現(xiàn)的時候也需要返回值
public class Main {
    public static void main(String[] args) {
        Test test = (int x, int y) -> {//參數(shù)、返回值與函數(shù)式接口中抽象方法一致
            return x + y;
        };
        test.add(1, 2);
    }
}

@FunctionalInterface
interface Test {
    int add(int x, int y);
}

2.3 lambda表達式的精簡

  • 參數(shù)精簡

    • 參數(shù)類型可以省略,若省略一個類型參數(shù),則所有的類型參數(shù)都要省略
    • 若只有一個參數(shù),則小括號可以省略
    • 若參數(shù)為0或者多于1個,則小括號不可以省略
  • 方法體精簡

    • 若方法體中只有一行代碼,則花括號可以省略
    • 若方法體中只有一行代碼且是return語句,則在省略大括號的時候還需要去掉return關(guān)鍵字
    • 若方法體中有多行代碼或者使用了return語句,則大括號不可以省略
    public class Main {
        public static void main(String[] args) {
            //只有一個參數(shù),省略了小括號
            //只有一條return語句,省略了花括號即return關(guān)鍵字
            Test test = x -> Math.exp(x);
    
            test.exp(1);
        }
    }
    
    @FunctionalInterface
    interface Test {
        double exp(double x);
    }
    

    2.4 變量作用域

    1. lambda表達式只可以訪問外部變量,但不能修改外部變量
    2. lambda表達式訪問的外部變量一般都是聲明為 final 的,但也可以不用聲明為 final ,但該變量在聲明后不能被修改
    3. lambda表達式中不允許聲明一個與局部變量同名的參數(shù)或局部變量
    public class Main {
        static final int a = 0;
    
        public static void main(String[] args) {
            final int num1 = 10;
            int num2 = 20;
    
            //num2 = 40; //聲明后不能被修改
            Test test1 = x -> {
                System.out.println(num1);//可以訪問外部被聲明為 final 的變量
                System.out.println(num2);//可以訪問外部的普通變量
    
                //num1 = 20;//只能訪問,不能修改
                //num2 = 20;//只能訪問,不能修改
    
                //int num1 = 20;//不允許聲明一個與局部變量同名的局部變量
                return Math.exp(x);
            };
            //num2 = 40; //聲明后不能被修改
    
            test1.exp(1);
    
            //不允許聲明一個與局部變量同名的參數(shù)
            //Test test2 = num1 -> Math.exp(num1);
        }
    }
    
    @FunctionalInterface
    interface Test {
        double exp(double x);
    }
    

3. 四大函數(shù)式接口

為了讓開發(fā)者高效地使用函數(shù)式接口,Java 8 在 java.util.function 包下提供了許多函數(shù)式接口,以下四種是最為常見的:

接口原型 抽象方法 備注
Consumer< T > accept(T t) 消費型接口
Supplier< T > T get() 供給型接口
Function<T, R> R apply(T t) 函數(shù)型接口
Predicate< T > boolean test(T t) 斷言型接口

3.1 Consumer< T >:消費型接口

該接口只接收輸入?yún)?shù)但不輸出返回值,消費對象,只進不出。

  • 接口原型:

    @FunctionalInterface
    public interface Consumer<T> {
        void accept(T t);
    }
    
  • 使用示例:

    import java.util.function.Consumer;
    
    public class Main {
        public static void main(String[] args) {
            Consumer<Integer> acc = (t) -> System.out.println(t);//實現(xiàn) Consumer 接口
            
            acc.accept(10);
        }
    }
    

3.2 Supplier< T >:供給型接口

該接口只輸出返回值但不接收輸入?yún)?shù),生成對象,只出不進。

  • 接口原型:

    public interface Supplier<T> {
        T get();
    }
    
  • 使用示例:

    import java.util.function.Supplier;
    
    public class Main {
        public static void main(String[] args) {
            Supplier<Integer> sup = () -> 10;//實現(xiàn) Supplier 接口
            
            System.out.println(sup.get());
        }
    }
    

3.3 Function<T, R>:函數(shù)型接口

該接口既接收輸入?yún)?shù)又輸出返回值,用于指定特定功能,有進有出

  • 接口原型:

    @FunctionalInterface
    public interface Function<T, R> {
        R apply(T t);
    }
    
  • 使用示例:

    import java.util.function.Function;
    
    public class Main {
        public static void main(String[] args) {
            Function<Integer, String> fun = (x) -> {//實現(xiàn) Function 接口
                String out = "輸入的整數(shù)是" + x;
                return out;
            };
    
            System.out.println(fun.apply(10));
        }
    }
    

3.4 Predicate< T >:斷言型接口

該接口既接收輸入?yún)?shù)又輸出返回值,且返回值只能是布爾值,用于條件判斷,有進有出。

  • 函數(shù)原型:

    public interface Predicate<T> {
        boolean test(T t);
    }
    
  • 使用示例:文章來源地址http://www.zghlxwxcb.cn/news/detail-693574.html

    import java.util.function.Predicate;
    
    public class Main {
        public static void main(String[] args) {
            Predicate<Integer> pre = (x) -> x % 2 == 0;//實現(xiàn) Predicate 接口
    
            int a = 10;
            if (pre.test(10)) {
                System.out.println(a + "是偶數(shù)");
            } else {
                System.out.println(a + "是奇數(shù)");
            }
        }
    }
    

到了這里,關(guān)于Java8新特性1——函數(shù)式接口&lambda表達式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 常用Java代碼-Java中的Lambda表達式和函數(shù)式接口

    Java中的Lambda表達式和函數(shù)式接口是Java 8中引入的一種新特性,允許編寫簡潔、可讀性強的代碼。Lambda表達式允許將簡單的代碼塊作為參數(shù)傳遞給函數(shù),而函數(shù)式接口則是一種只有一個抽象方法的接口,可以用于定義Lambda表達式。 下面是一個Lambda表達式的示例: 在這個例子中

    2024年01月18日
    瀏覽(31)
  • Java 8及以上新特性:Lambda表達式、Stream API、Optional類與接口默認(rèn)方法(四)

    目錄 一、接口默認(rèn)方法 1.1 概念解析: 1.2 應(yīng)用場景: 1.3 使用注意事項: 1.4 使用示例: 二、結(jié)論 1.1 總結(jié)Java 8及以上版本四大新特性的重要意義與價值: 1.2 鼓勵讀者積極學(xué)習(xí)并運用這些新特性: 1.3 對未來Java版本可能引入的新特性進行展望: 1.1 概念解析: 接口默認(rèn)方法

    2024年04月13日
    瀏覽(30)
  • Java8 lambda 表達式 forEach 如何提前終止?

    Java8 lambda 表達式 forEach 如何提前終止?

    首先,讓我們看一下Java 8中如何使用forEach()方法。forEach()方法接受一個Consumer接口作為參數(shù),該接口定義了一個accept()方法,該方法接受一個對象并對其執(zhí)行一些操作。因此,我們可以通過Lambda表達式來實現(xiàn)Consumer接口。下面是一個使用Lambda表達式的forEach()方法的示例: 在上面

    2024年02月12日
    瀏覽(20)
  • java學(xué)習(xí)路程之篇三、進階知識、面向?qū)ο蟾呒?、接口新特性、代碼塊、內(nèi)部類、Lambda表達式、窗體、組件、事件

    概述 生成值類型響應(yīng)式數(shù)據(jù) 通過 .value 值修改 生成對象和數(shù)組類型的響應(yīng)式對象選用 reactive 方式比較好 html JavaScript 概述 reactive 方法根據(jù)傳入的對象,創(chuàng)建返回一個深度響應(yīng)式對象。響應(yīng)式對象看起來和傳入的對象一樣。但是,響應(yīng)式對象屬性值改動,不管層級有多深,都

    2024年02月16日
    瀏覽(21)
  • Java新特性:Lambda表達式

    Java新特性:Lambda表達式

    Java新特性:Lambda表達式 Lambda 表達式(Lambda expression),也可稱為閉包(Closure),是 Java(SE)8 中一個重要的新特性。Lambda 表達式允許我們通過表達式來代替功能接口。Lambda 表達式就和方法一樣,它提供了一個正常的參數(shù)列表和一個使用這些參數(shù)的主體(body,可以是一個表

    2024年02月13日
    瀏覽(33)
  • Java 8 新特性——Lambda 表達式(2)

    Java 8 新特性——Lambda 表達式(2)

    ????????Java Stream函數(shù)式編程接口最初在Java 8中引入,并且與 lambda 一起成為Java開發(fā)里程碑式的功能特性,它極大的方便了開放人員處理集合類數(shù)據(jù)的效率。 ????????Java Stream就是一個數(shù)據(jù)流經(jīng)的管道,并且在管道中對數(shù)據(jù)進行操作,然后流入下一個管道。有學(xué)過linux

    2024年02月11日
    瀏覽(27)
  • Java 8 新特性之Lambda表達式

    函數(shù)式編程(Functional Programming)是把函數(shù)作為基本運算單元,函數(shù)可以作為變量,可以接收函數(shù),還可以返回函數(shù)。歷史上研究函數(shù)式編程的理論是Lambda演算,所以我們經(jīng)常把支持函數(shù)式編程的編碼風(fēng)格稱為Lambda表達式。 在Java中使用Lambda表達式的前提:需要是函數(shù)接口。

    2024年01月22日
    瀏覽(30)
  • Lambda表達式 & 函數(shù)式接口 & Stream流

    Lambda表達式 & 函數(shù)式接口 & Stream流

    目錄 一.?Lambda表達式 1. 函數(shù)式編程思想概述 2.?Lambda的優(yōu)化 3. Lambda的格式 標(biāo)準(zhǔn)格式: 參數(shù)和返回值: 省略格式: 4.?Lambda的前提條件 ?二. 函數(shù)式接口 1.?概述 格式 FunctionalInterface注解 2.?常用函數(shù)式接口 Supplier接口 Consumer接口 Function接口 Predicate接口 三. Stream流 1 引言 2.?流式思

    2024年02月08日
    瀏覽(25)
  • JAVA8-lambda表達式8:在設(shè)計模式-模板方法中的應(yīng)用

    JAVA8-lambda表達式1:什么是lambda表達式 JAVA8-lambda表達式2:常用的集合類api JAVA8-lambda表達式3:并行流,提升效率的利器? JAVA8-lambda表達式4:Optional用法 java8-lambda表達式5:toMap引發(fā)的線上故障 JAVA8-lambda表達式6:重構(gòu)和定制收集器 JAVA8-lambda表達式7:重要的函數(shù)接口 最近在公司

    2024年02月14日
    瀏覽(29)
  • 【Java系列】JDK 1.8 新特性之 Lambda表達式

    【Java系列】JDK 1.8 新特性之 Lambda表達式

    Lambda是一個匿名函數(shù),我們可以將Lambda表達式理解為一段可以傳遞的代碼(將代碼像數(shù)據(jù)一樣傳遞)。使用它可以寫出簡潔、靈活的代碼。作為一種更緊湊的代碼風(fēng)格,使java語言表達能力得到提升。 結(jié)果: ?19:43:39.303 [main] INFO com.chen.test.JAVA8Features.Demo01 - 我是沒有使用Lambda表

    2024年02月22日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包