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

資訊專欄INFORMATION COLUMN

JDK8新特性Lambda表達(dá)式體驗(yàn)

curlyCheng / 2138人閱讀

摘要:的一個(gè)大亮點(diǎn)是引入表達(dá)式,使用它設(shè)計(jì)的代碼會(huì)更加簡潔。簡介表達(dá)式的語法由參數(shù)列表箭頭符號和函數(shù)體組成。表達(dá)式示例下面就用一些例子來體驗(yàn)一下表達(dá)式。類優(yōu)惠政策滿足的條件,返回接收訂單對象,對訂單對象進(jìn)行處理其中接收對象并返回。

“Lambda 表達(dá)式”(lambda expression)是一個(gè)匿名函數(shù),Lambda表達(dá)式基于數(shù)學(xué)中的λ演算得名,直接對應(yīng)于其中的lambda抽象(lambda abstraction),是一個(gè)匿名函數(shù),即沒有函數(shù)名的函數(shù)。Java 8的一個(gè)大亮點(diǎn)是引入Lambda表達(dá)式,使用它設(shè)計(jì)的代碼會(huì)更加簡潔。當(dāng)開發(fā)者在編寫Lambda表達(dá)式時(shí),也會(huì)隨之被編譯成一個(gè)函數(shù)式接口。

Lambda簡介

Lambda表達(dá)式的語法由參數(shù)列表、箭頭符號->和函數(shù)體組成。函數(shù)體既可以是一個(gè)表達(dá)式,也可以是一個(gè)語句塊。

比如:

(int x, int y) -> x + y;

具體的Lambda表達(dá)式的介紹可以看這篇博客,寫得挺詳細(xì)的。

Java Lambda表達(dá)式示例

下面就用一些例子來體驗(yàn)一下Lambda表達(dá)式。

遍歷集合

比如我們現(xiàn)在要遍歷一個(gè)List:

List list = Arrays.asList("Hello", "JDK8", "and", "Lambda");

JDK8之前的寫法:

for (String s : list) {
    System.out.println(s);
}

用Lambda表達(dá)式寫法:

list.forEach(s -> System.out.println(s));

可以看到,無論是代碼量和可讀性都得到了提高。

在此基礎(chǔ)上還可以再用隱式表達(dá)式進(jìn)行簡化:

list.forEach(System.out::println);
匿名類

在Java中很多時(shí)候我們要用到匿名類,比如線程Runnable、FileFilter和Comparator等等。
而匿名類型最大的問題就在于其冗余的語法。

這里用Comparator做例子。

比如我們有一個(gè)Cat類,表示貓,有名字、高度和重量這些屬性。

package com.fengyuan.model;

import lombok.AllArgsConstructor;
import lombok.Data;

public @Data @AllArgsConstructor class Cat {
    private String name;
    private double height;
    private double weight;
}

我們創(chuàng)建3只貓,存到List中:

List catList = new ArrayList<>();
// 請無視這些數(shù)據(jù)的合理性,我亂寫的
catList.add(new Cat("cat1", 10.3, 3.6));
catList.add(new Cat("cat2", 9.3, 4.6));
catList.add(new Cat("cat3", 9.5, 4.0));

然后我們現(xiàn)在要對這個(gè)List進(jìn)行排序,但是現(xiàn)在不知道是要怎么排,所以我們要定義一個(gè)比較器,指定用高度或者是重量來排序。

JDK8之前的寫法:

// 指定用高度來排序
Collections.sort(catList, new Comparator() {
    @Override
    public int compare(Cat o1, Cat o2) {
        if (o1.getHeight() > o2.getHeight()) {
            return 1;
        } else if (o1.getHeight() < o2.getHeight()) {
            return -1;
        } else {
            return 0;
        }
     }
});

而用Lambda,可以這樣寫:

Collections.sort(catList, (o1, o2) -> {
    if (o1.getHeight() > o2.getHeight()) {
        return 1;
    } else if (o1.getHeight() < o2.getHeight()) {
        return -1;
    } else {
        return 0;
    }
});

繼續(xù)用方法引用,可以簡寫到極致:

// 指定用重量排序
catList.sort(Comparator.comparing(Cat::getWeight));
// 要逆向排列也很簡單
catList.sort(Comparator.comparing(Cat::getWeight).reversed());

到最后這種寫法,已經(jīng)簡寫到極致,而且可讀性非常高。

函數(shù)式接口

JDK8增加了一個(gè)新的包:java.util.function,它里面包含了常用的函數(shù)式接口,比如Predicate、Consumer,F(xiàn)unction等等。

接下來就體驗(yàn)一下Predicate和Consumer的用法。

我們現(xiàn)在有一個(gè)訂單類,有id,金額,運(yùn)費(fèi)這些屬性。這個(gè)訂單有一個(gè)折扣方法,我們希望能夠根據(jù)營銷活動(dòng),動(dòng)態(tài)修改優(yōu)惠方案。
Order類:

package com.fengyuan.model;

import java.util.function.Consumer;
import java.util.function.Predicate;

import lombok.AllArgsConstructor;
import lombok.Data;

public @Data @AllArgsConstructor class Order {
    private long id;
    private double payment;
    private double freight;

    // 優(yōu)惠政策
    public Order discount(Order order, Predicate predicate, Consumer consumer) {
        // 滿足Predicate的條件,返回true
        if (predicate.test(order)) {
            // 接收訂單對象,對訂單對象進(jìn)行處理
            consumer.accept(order);
        }

        return order;
    }
}

其中

Predicate:接收T對象并返回boolean。

Consumer:接收T對象,沒有返回值。

然后通過函數(shù)式編程,我們可以動(dòng)態(tài)傳入我們的優(yōu)惠方案,比如99包郵:

// 新建一個(gè)訂單,506.5的金額,10.0的運(yùn)費(fèi)
Order order = new Order(123, 506.5, 10.0);
// 滿足金額>=99的條件,則設(shè)置運(yùn)費(fèi)為0
order.discount(order, 
        o -> o.getPayment() >= 99, 
        o -> o.setFreight(0));

這樣一來,就能根據(jù)營銷活動(dòng),修改我們的優(yōu)惠方案。

除此之外,Predicate對象之間還能運(yùn)用與或非這些邏輯操作,比如:

predicate1.and(predicate2);
predicate1.or(predicate2);
Stream

這里的Stream和I/O流不同,它更像具有Iterable的集合類。

Stream API引入的目的在于彌補(bǔ)Java函數(shù)式編程的缺陷,讓java也支持map()、reduce()等函數(shù)式編程語言。

map

map(映射),將傳入的函數(shù)依次作用到序列的每個(gè)元素。

比如說,有一個(gè)字符串列表,我們現(xiàn)在給列表里每個(gè)字符串調(diào)用toLowerCase()方法,轉(zhuǎn)成小寫字母。

List list = Arrays.asList("Hello", "JDK8", "and", "Lambda");

轉(zhuǎn)成小寫,用collect()把Stream再轉(zhuǎn)回List,返回新的列表:

List newList = list.stream().map(s -> s.toLowerCase()).collect(Collectors.toList());

也可以返回一個(gè)字符串,指定連接符,我這里是用空格連接的:

String str = list.stream().map(s -> s.toLowerCase()).collect(Collectors.joining(" "));

也可以用隱式函數(shù),String::toLowerCase來實(shí)現(xiàn):

String str = list.stream().map(String::toLowerCase).collect(Collectors.joining(" "));
reduce

reduce(歸約),將集合中所有值結(jié)合起來。

將一個(gè)整型List,先進(jìn)行map:每個(gè)數(shù)都翻一倍,再進(jìn)行reduce:所有數(shù)加起來,得到結(jié)果:

        List numbers = Arrays.asList(10, 20, 30, 40, 50);
        int result = numbers.stream().map(num -> num * 2).reduce((r, num) -> r += num).get();
變量捕捉

一個(gè)簡單的例子,算出一個(gè)集合中最大值、最小值、平均值等等。

集合:

List numbers = Arrays.asList(4, 6, 65, 3, 44, 2, 17, 19);

計(jì)算:

int max = numbers.stream().mapToInt(x -> x).max().getAsInt();
int min = numbers.stream().mapToInt(x -> x).min().getAsInt();
long count = numbers.stream().mapToInt(x -> x).count();
double avg = numbers.stream().mapToInt(x -> x).average().getAsDouble();
int sum = numbers.stream().mapToInt(x -> x).sum();

也可以用IntSummaryStatistics類來得到統(tǒng)計(jì)結(jié)果:

IntSummaryStatistics stat = numbers.stream().mapToInt(x -> x).summaryStatistics();
int max = stat.getMax();
int min = stat.getMin();
long count = stat.getCount();    
double avg = stat.getAverage();
long sum = stat.getSum();
結(jié)語

雖然平時(shí)項(xiàng)目的開發(fā)中還是比較少用到Lambda表達(dá)式,但是在以上這些體驗(yàn)中,確實(shí)是感受到了它的魅力。

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/65072.html

相關(guān)文章

  • 認(rèn)識JDK8特性Lambda達(dá)式

    摘要:說來挺慚愧的,已經(jīng)出來這么多年,在實(shí)際項(xiàng)目中卻很少真正使用表達(dá)式。舉個(gè)簡單例子對于無參無返回值,可以有如下寫法前的一對小括號和后面的一對大括號都不能去掉。表達(dá)式不會(huì)定義新的作用域表達(dá)式的作用域與封閉作用域相同。 說來挺慚愧的,JDK8已經(jīng)出來這么多年,在實(shí)際項(xiàng)目中卻很少真正使用Lambda表達(dá)式。其實(shí)工作中的項(xiàng)目很早就從開發(fā)、測試、生產(chǎn),全面使用JDK8+Tomcat8了。 所以看來是...

    awesome23 評論0 收藏0
  • 轉(zhuǎn) | Java8初體驗(yàn)(一)lambda達(dá)式語法

    摘要:初體驗(yàn)下面進(jìn)入本文的正題表達(dá)式。接下來展示表達(dá)式和其好基友的配合。吐槽一下方法引用表面上看起來方法引用和構(gòu)造器引用進(jìn)一步簡化了表達(dá)式的書寫,但是個(gè)人覺得這方面沒有的下劃線語法更加通用。 感謝同事【天錦】的投稿。投稿請聯(lián)系 tengfei@ifeve.com 本文主要記錄自己學(xué)習(xí)Java8的歷程,方便大家一起探討和自己的備忘。因?yàn)楸救艘彩莿倓傞_始學(xué)習(xí)Java8,所以文中肯定有錯(cuò)誤和理解偏...

    Lucky_Boy 評論0 收藏0
  • 【全棧之路】JAVA基礎(chǔ)課程十一_JDK8十大特性(20190706v1.2)

    摘要:歡迎進(jìn)入基礎(chǔ)課程博客地址本系列文章將主要針對一些基礎(chǔ)知識點(diǎn)進(jìn)行講解,為平時(shí)歸納所總結(jié),不管是剛接觸開發(fā)菜鳥還是業(yè)界資深人士,都希望對廣大同行帶來一些幫助。語法是,或者更一般的,要求構(gòu)造器方法是沒有參數(shù)靜態(tài)方法引用。 歡迎進(jìn)入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對JAVA一些基礎(chǔ)知識點(diǎn)進(jìn)行講解,為平時(shí)歸納所總結(jié),...

    lcodecorex 評論0 收藏0
  • 【全棧之路】JAVA基礎(chǔ)課程十一_JDK8十大特性(20190706v1.2)

    摘要:歡迎進(jìn)入基礎(chǔ)課程博客地址本系列文章將主要針對一些基礎(chǔ)知識點(diǎn)進(jìn)行講解,為平時(shí)歸納所總結(jié),不管是剛接觸開發(fā)菜鳥還是業(yè)界資深人士,都希望對廣大同行帶來一些幫助。語法是,或者更一般的,要求構(gòu)造器方法是沒有參數(shù)靜態(tài)方法引用。 歡迎進(jìn)入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對JAVA一些基礎(chǔ)知識點(diǎn)進(jìn)行講解,為平時(shí)歸納所總結(jié),...

    VPointer 評論0 收藏0
  • lambda達(dá)式一,介紹

    摘要:體驗(yàn)的更優(yōu)寫法借助的全新語法,上述接口的匿名內(nèi)部類寫法可以通過更簡單的表達(dá)式達(dá)到等效多線程任務(wù)執(zhí)行啟動(dòng)線程這段代碼和剛才的執(zhí)行效果是完全一樣的,可以在或更高的編譯級別下通過。 jdk8 2014年加入了lambda表達(dá)式實(shí)例代碼 showImg(https://segmentfault.com/img/bVbwb0V); showImg(https://segmentfault.com...

    ybak 評論0 收藏0

發(fā)表評論

0條評論

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