成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Java 8 新特性之Lambda表達(dá)式

Ververica / 3161人閱讀

摘要:概述簡介是一個(gè)匿名函數(shù),我們可以把表達(dá)式理解為是一段可以傳遞的代碼將代碼像數(shù)據(jù)一樣進(jìn)行傳遞。作為一種更緊湊的代碼風(fēng)格,使的語言表達(dá)能力得到了提升。任何滿足單一抽象方法法則的接口,都會(huì)被自動(dòng)視為函數(shù)接口。

1. 概述 1.1 簡介

Lambda 是一個(gè)匿名函數(shù),我們可以把 Lambda 表達(dá)式理解為是一段可以傳遞的代碼(將代碼像數(shù)據(jù)一樣進(jìn)行傳遞)??梢詫懗龈啙崱⒏`活的代碼。作為一種更緊湊的代碼風(fēng)格,使 Java 的語言表達(dá)能力得到了提升。

1.2 為什么要使用 Lambda 表達(dá)式 1. 實(shí)例

比如說我們要為 TreeSet 添加一個(gè)比價(jià)器,如果用原來的匿名內(nèi)部類實(shí)現(xiàn)如下

@Test
public void test1() {
    Comparator com = new Comparator() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return Integer.compare(o1, o2);
        }
    };

    TreeSet ts = new TreeSet<>(com);

    TreeSet ts2 = new TreeSet<>(new Comparator() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return Integer.compare(o1, o2);
        }
    });

    ts2.addAll(Arrays.asList(4, 5, 7, 3, 2, 1, 8, 6, 9));
    System.out.println(ts2.toString());
}

Lambda 表達(dá)式實(shí)現(xiàn)如下

@Test
public void test2() {
    Comparator com = (x, y) -> Integer.compare(x, y);
    TreeSet ts = new TreeSet<>(com);
    ts.addAll(Arrays.asList(4, 5, 7, 3, 2, 1, 8, 6, 9));
    System.out.println(ts.toString());
}
2. 實(shí)例

對(duì)一個(gè) List 里面的對(duì)象進(jìn)行操作

實(shí)體類

public class Employee implements Serializable {

    private int id;
    private String name;
    private int age;
    private double salary;
    
    // 省略 getter 和 setter 方法
}

基礎(chǔ)數(shù)據(jù)

List emps = Arrays.asList(
        new Employee(1, "張三", 18, 9999.99),
        new Employee(2, "李四", 59, 6666.66),
        new Employee(3, "王五", 28, 3333.33),
        new Employee(4, "趙六", 8, 7777.77),
        new Employee(5, "田七", 38, 5555.55)
);
普通實(shí)現(xiàn)

我們有兩個(gè)需求,一個(gè)是“獲取公司中年齡小于 35 的員工信息”,一個(gè)是“獲取公司中工資大于 5000 的員工信息”

/**
 * 需求:獲取公司中年齡小于 35 的員工信息
 *
 * @param emps
 * @return
 */
public List filterEmployeeAge(List emps) {
    List list = new ArrayList<>();
    for (Employee emp : emps) {
        if (emp.getAge() <= 35) {
            list.add(emp);
        }
    }
    return list;
}

@Test
public void test3() {
    List list = filterEmployeeAge(emps);

    for (Employee employee : list) {
        System.out.println(employee);
    }
}

/**
 * 需求:獲取公司中工資大于 5000 的員工信息
 *
 * @param emps
 * @return
 */
public List filterEmployeeSalary(List emps) {
    List list = new ArrayList<>();
    for (Employee emp : emps) {
        if (emp.getSalary() >= 5000) {
            list.add(emp);
        }
    }
    return list;
}

這樣的話我要神隊(duì)每個(gè)需求都寫個(gè)方法,如果再增加需求,還需要再寫

優(yōu)化方式一:策略設(shè)計(jì)模式

定義一個(gè)接口

public interface MyPredicate {

    public boolean test(T t);
    
}
/**
 * 策略設(shè)計(jì)模式
 *
 * @param emps
 * @param mp
 * @return
 */
public List filterEmployee(List emps, MyPredicate mp) {
    List list = new ArrayList<>();
    for (Employee employee : emps) {
        if (mp.test(employee)) {
            list.add(employee);
        }
    }
    return list;
}

/**
 * 根據(jù)不同的需求實(shí)現(xiàn)不同的策略
 */
@Test
public void test4() {
    List list = filterEmployee(emps, new FilterEmployeeForAge());
    for (Employee employee : list) {
        System.out.println(employee);
    }

    System.out.println("---------------------------------------");

    List list2 = filterEmployee(emps, new FilterEmployeeForSalary());
    for (Employee employee : list2) {
        System.out.println(employee);
    }
}
優(yōu)化方式二:匿名內(nèi)部類
/**
 * 匿名內(nèi)部類
 */
@Test
public void test5() {
    List list = filterEmployee(emps, new MyPredicate() {
        @Override
        public boolean test(Employee t) {
            return t.getId() <= 103;
        }
    });

    for (Employee employee : list) {
        System.out.println(employee);
    }
}
優(yōu)化方式三:Lambda 表達(dá)式
/**
 * Lambda 表達(dá)式
 */
@Test
public void test6() {
    List list = filterEmployee(emps, (e) -> e.getAge() <= 35);
    list.forEach(System.out::println);

    System.out.println("------------------------------------------");

    List list2 = filterEmployee(emps, (e) -> e.getSalary() >= 5000);
    list2.forEach(System.out::println);
}
優(yōu)化方式四:Stream API
/**
 * Stream API
 */
@Test
public void test7() {
    emps.stream()
            .filter((e) -> e.getAge() <= 35)
            .forEach(System.out::println);

    System.out.println("----------------------------------------------");

    emps.stream()
            .map(Employee::getName)
            .limit(3)
            .sorted()
            .forEach(System.out::println);
}
2. Lambda 表達(dá)式的基礎(chǔ)語法

Java8 中引入了一個(gè)新的操作符 -> 該操作符稱為箭頭操作符或 Lambda 操作符,箭頭操作符將 Lambda 表達(dá)式拆分成兩部分:

左側(cè):Lambda 表達(dá)式的參數(shù)列表(即接口抽象方法的參數(shù)列表)

右側(cè):Lambda 表達(dá)式中所需執(zhí)行的功能, 即 Lambda 體(即接口的實(shí)現(xiàn))

Lambda 表達(dá)式需要“函數(shù)式接口”的支持

函數(shù)式接口:接口中只有一個(gè)抽象方法的接口,稱為函數(shù)式接口??梢允褂米⒔?@FunctionalInterface 修飾,可以檢查是否是函數(shù)式接口

函數(shù)式接口可以有默認(rèn)方法和靜態(tài)方法。

任何滿足單一抽象方法法則的接口,都會(huì)被自動(dòng)視為函數(shù)接口。這包括 Runnable 和 Callable 等傳統(tǒng)接口,以及您自己構(gòu)建的自定義接口。

2.1 無參數(shù),無返回值
() -> System.out.println("Hello Lambda!");
1. 實(shí)例
@Test
public void t1(){
    Runnable r1 = () -> System.out.println("Hello Lambda!");
    r1.run();
}
2.2 有一個(gè)參數(shù),并且無返回值
(x) -> System.out.println(x)
1. 實(shí)例
@Test
public void t2(){
    Consumer con = (x) -> System.out.println(x);
    con.accept("Hello Lambda!");
}
2. 實(shí)例

如果只有一個(gè)參數(shù)的情況下小括號(hào)是可以省略的

@Test
public void t3(){
    Consumer con = x -> System.out.println(x);
    con.accept("Hello Lambda!");
}
2.3 有兩個(gè)以上的參數(shù),有返回值,并且 Lambda 體中有多條語句 1. 實(shí)例
@Test
public void t4() {
    Comparator com = (x, y) -> {
        System.out.println("函數(shù)式接口");
        return Integer.compare(x, y);
    };
}
2.4 若 Lambda 體中只有一條語句, return 和 大括號(hào)都可以省略不寫 1. 實(shí)例
@Test
public void t5(){
    Comparator com = (x, y) -> Integer.compare(x, y);
}

Lambda 表達(dá)式的參數(shù)列表的數(shù)據(jù)類型可以省略不寫,因?yàn)镴VM編譯器通過上下文推斷出,數(shù)據(jù)類型,即“類型推斷”,如果寫類型的話如下

@Test
public void t6(){
    Comparator com = (Integer x,Integer y) -> Integer.compare(x, y);
}
本文首發(fā)于凌風(fēng)博客:Java 8 新特性之Lambda表達(dá)式
作者:凌風(fēng)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/72743.html

相關(guān)文章

  • Java 8 特性方法引用

    摘要:概述簡介若體中的功能,已經(jīng)有方法提供了實(shí)現(xiàn),可以使用方法引用可以將方法引用理解為表達(dá)式的另外一種表現(xiàn)形式方法引用的三種形式對(duì)象的引用實(shí)例方法名類名靜態(tài)方法名類名實(shí)例方法名注意方法引用所引用的方法的參數(shù)列表與返回值類型,需要與函數(shù)式接口中抽象 1. 概述 1.1 簡介 若 Lambda 體中的功能,已經(jīng)有方法提供了實(shí)現(xiàn),可以使用方法引用(可以將方法引用理解為 Lambda 表達(dá)式的另外一...

    wudengzan 評(píng)論0 收藏0
  • Java8特性Lambda達(dá)式

    摘要:表達(dá)式說白了就是一種匿名方法,不需要方法名,修飾符,和返回值類型。就目前而言表達(dá)式只能簡化接口的匿名內(nèi)部類實(shí)現(xiàn)。 Lambda表達(dá)式說白了就是一種匿名方法,不需要方法名,修飾符,和返回值類型。 使用方法 首先在moudle的build.gradle文件中添加配置:app/build.gradle添加。 android { ... defaultConfi...

    mist14 評(píng)論0 收藏0
  • Java8 lambda 達(dá)式、方法引用、函數(shù)式接口、默認(rèn)方式、靜態(tài)方法

    摘要:歐陽思海繼承接口后,又加了新的抽象方法,這個(gè)接口就不再是函數(shù)式接口默認(rèn)方法在接口中添加了一個(gè)默認(rèn)方法??偨Y(jié)在這篇文章中,我們講了表達(dá)式方法引用函數(shù)式接口接口中的靜態(tài)方法接口中的默認(rèn)方法的使用。 今天我來聊聊 Java8 的一些新的特性,確實(shí) Java8 的新特性的出現(xiàn),給開發(fā)者帶來了非常大的便利,可能剛剛開始的時(shí)候會(huì)有點(diǎn)不習(xí)慣的這種寫法,但是,當(dāng)你真正的熟悉了之后,你一定會(huì)愛上這些新的...

    isLishude 評(píng)論0 收藏0
  • 深入淺出 Java 8 Lambda 達(dá)式

    摘要:在支持一類函數(shù)的語言中,表達(dá)式的類型將是函數(shù)。匿名函數(shù)的返回類型與該主體表達(dá)式一致如果表達(dá)式的主體包含一條以上語句,則表達(dá)式必須包含在花括號(hào)中形成代碼塊。注意,使用表達(dá)式的方法不止一種。 摘要:此篇文章主要介紹 Java8 Lambda 表達(dá)式產(chǎn)生的背景和用法,以及 Lambda 表達(dá)式與匿名類的不同等。本文系 OneAPM 工程師編譯整理。 Java 是一流的面向?qū)ο笳Z言,除了部分簡...

    wdzgege 評(píng)論0 收藏0
  • 樂字節(jié)Java8核心特性實(shí)戰(zhàn)方法引用

    摘要:大家好,我是樂字節(jié)的小樂,上一次我們說到了核心特性之函數(shù)式接口,接下來我們繼續(xù)了解又一核心特性方法引用。方法引用是一種更簡潔易懂的表達(dá)式。感謝光臨閱讀小樂的,敬請(qǐng)關(guān)注樂字節(jié)后續(xù)將繼續(xù)講述等前沿知識(shí)技術(shù)。 大家好,我是樂字節(jié)的小樂,上一次我們說到了Java8核心特性之函數(shù)式接口,接下來我們繼續(xù)了解Java8又一核心特性——方法引用。 showImg(https://segmentfaul...

    lakeside 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<