国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

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

Ververica / 3101人閱讀

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

1. 概述 1.1 簡(jiǎn)介

Lambda 是一個(gè)匿名函數(shù),我們可以把 Lambda 表達(dá)式理解為是一段可以傳遞的代碼(將代碼像數(shù)據(jù)一樣進(jìn)行傳遞)。可以寫(xiě)出更簡(jiǎn)潔、更靈活的代碼。作為一種更緊湊的代碼風(fēng)格,使 Java 的語(yǔ)言表達(dá)能力得到了提升。

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

比如說(shuō)我們要為 TreeSet 添加一個(gè)比價(jià)器,如果用原來(lái)的匿名內(nèi)部類(lè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í)體類(lèi)

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

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

優(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)部類(lèi)
/**
 * 匿名內(nèi)部類(lè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ǔ)語(yǔ)法

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

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

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

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

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

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

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

2.1 無(wú)參數(shù),無(wú)返回值
() -> System.out.println("Hello Lambda!");
1. 實(shí)例
@Test
public void t1(){
    Runnable r1 = () -> System.out.println("Hello Lambda!");
    r1.run();
}
2.2 有一個(gè)參數(shù),并且無(wú)返回值
(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 體中有多條語(yǔ)句 1. 實(shí)例
@Test
public void t4() {
    Comparator com = (x, y) -> {
        System.out.println("函數(shù)式接口");
        return Integer.compare(x, y);
    };
}
2.4 若 Lambda 體中只有一條語(yǔ)句, return 和 大括號(hào)都可以省略不寫(xiě) 1. 實(shí)例
@Test
public void t5(){
    Comparator com = (x, y) -> Integer.compare(x, y);
}

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

@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.specialneedsforspecialkids.com/yun/72743.html

相關(guān)文章

  • Java 8 特性方法引用

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

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

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

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

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

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

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

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

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

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<