成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java8實(shí)用技能

microcosm1994 / 3464人閱讀

大概一年多之前,我對java8的理解還僅限一些只言片語的文章之上,后來出于對函數(shù)式編程的興趣,買了本參考書看了一遍,然后放在了書架上,后來,當(dāng)我接手大客戶應(yīng)用的開發(fā)工作之后,java8的一些工具,對我的效率有了不小的提升,因此想記錄一下java"8的一些常用場景,我希望這會(huì)成為一個(gè)小字典,能讓我免于頻繁翻書,但是總能找到自己想找的知識(shí)。

用于舉例的model:

@Data
public class Apple {
    private Long appleId;
    private String appleName;
    private Float appleWeight;
    private Integer appleClassic;
}
一、Java 8 Lambda 表達(dá)式

這無疑是最常用的功能之一,其實(shí)lambda表達(dá)式的作用,應(yīng)該就是簡潔明了,實(shí)際上是用最短的字符,通過類型推導(dǎo),語法糖等方式去對編譯器描述清楚這段代碼的功能,這和泛型有點(diǎn)相似,對于編程人員來說,一定程度上也提高了編程效率和代碼可讀性。

如常用的lambda表達(dá)式:
process(()->System.out.println("this is so cool!"))

例如對蘋果重量排序:

   List apples = Lists.newArrayList();
        for (int i = 1; i < 10; i++) {
            Apple apple = new Apple();
            apples.add(apple);
        }
        apples.sort(Comparator.comparing(Apple::getAppleWeight));


反序:
        apples.sort(Comparator.comparing(Apple::getAppleWeight).reversed());


重量相同時(shí):比較等級:



  apples.sort(Comparator
                .comparing(Apple::getAppleWeight)
                .reversed()



謂詞復(fù)合查詢:


  Predicate a = apple -> apple.getAppleWeight() > 10;
        weight10.or(apple -> apple.getAppleClassic() > 2)
                .and(apple -> StringUtils.equalsIgnoreCase(apple.getAppleName(), "優(yōu)質(zhì)蘋果"));
                
可以看做(a||b)&&c


函數(shù)復(fù)合:


        Function f = a -> a.getAppleWeight() + 1;
        Function g = a -> a * 2;
        Function h = f.andThen(g);
        
    數(shù)學(xué)寫作 h=g(f(x))

  Function g = a -> a.getAppleWeight() + 1;
        Function f = a -> a * 2;
        Function h = f.compose(g);
 數(shù)學(xué)寫作 h=f(g(x))

小結(jié):java8實(shí)際上想傳遞函數(shù),函數(shù)是什么?是一個(gè)映射,可以看做x->y,輸入x然后映射到值y的過程,
java無法擺脫一切皆是對象的思想,因此函數(shù)式依附在對象上傳遞的,因此也有了下面的說法,方法引用,以及函數(shù)式接口,讓函數(shù)隨著對象傳遞,為了函數(shù)式編程,甚至專門寫一個(gè)接口---對象來傳遞函數(shù)。然而,函數(shù)才是主角。

二、Java 8 方法引用

方法引用十分簡單,其實(shí)也是將方法作為參數(shù)傳遞。使用::域作用符,將一段方法傳遞。
舉例:Apple::getAppleId

 String::subString
 System.out::println






三、Java 8 函數(shù)式接口 函數(shù)式編程

利用java進(jìn)行函數(shù)式編程主要就是利用函數(shù)式接口,但是函數(shù)式接口在java8之前就有一些了,就例如多線程的runnable,但是8以前是沒有l(wèi)ambda表達(dá)式的,所以只能使用匿名內(nèi)部類,在用過lambda表達(dá)式的人看來,那是相當(dāng)臃腫的,8更新了lambda表達(dá)式,這就使函數(shù)式編程更上一層樓.

java8的函數(shù)式接口為我們傳遞函數(shù)提供了工具,我們可以自己定義函數(shù)式接口,然后讓其他人,或者是java API調(diào)用。
關(guān)于函數(shù)接口,需要記住的就是兩件事:
函數(shù)接口是行為的抽象;
函數(shù)接口是數(shù)據(jù)轉(zhuǎn)換器。

四、Java 8 Stream

在我接觸到j(luò)ava8流式處理的時(shí)候,我的第一感覺是流式處理讓集合操作變得簡潔了許多,通常我們需要多行代碼才能完成的操作,借助于流式處理可以在一行中實(shí)現(xiàn)。其本質(zhì)是,將一些原本開發(fā)者需要做的處理如迭代等,放在了java庫里,讓我們只關(guān)心自己的業(yè)務(wù)邏輯,比如我們希望對一個(gè)包含整數(shù)的集合中篩選出所有的偶數(shù),并將其封裝成為一個(gè)新的List返回,那么在java8之前,我們需要通過如下代碼實(shí)現(xiàn):

過去:
List evens = new ArrayList<>();
for (final Integer num : nums) {
    if (num % 2 == 0) {
        evens.add(num);
    }
}

stream實(shí)現(xiàn):
List evens = nums.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());



我們需要取出10個(gè)等級高于3的蘋果,跳過其中兩個(gè),按重量排序,去重,然后取出蘋果的Name,然后取出名字的每個(gè)字符:
 List appleName = apples.parallelStream()
                .filter(a -> a.getAppleClassic() < 2)
                .sorted(Comparator.comparing(Apple::getAppleWeight))
                .map(Apple::getAppleName)
                .map(s -> s.split(""))
                .limit(10)
                .skip(2)
                .distinct()
                .flatMap(Arrays::stream)
                .collect(Collectors.toList());   
                
構(gòu)造AppleId ApppleName Map:
        Map appleIdMap = apples.stream()
                .collect(Collectors.toMap(Apple::getAppleId, Apple::getAppleName, (s, s2) -> s.length() > s2.length() ? s : s2));
       
       
 謂詞查找:      
 if (appleName.stream().anyMatch(a -> StringUtils.equalsIgnoreCase(a, "一級蘋果")));
        if (appleName.stream().allMatch(a -> StringUtils.equalsIgnoreCase(a, "一級蘋果")));
        if (appleName.stream().noneMatch(a -> StringUtils.equalsIgnoreCase(a, "一級蘋果")));
     


短路查找:
        appleName.stream()
                .filter(a -> StringUtils.equalsIgnoreCase(a, "一級蘋果"))
                .findAny()
                .ifPresent(System.out::println);
findfirst在并行時(shí)限制多一些,如果不在意返回的是哪個(gè)元素,使用findAny。
                
       
求和:         
    apples.stream()
    .map(Apple::getAppleWeight)
    .reduce(0F, (a, b) -> a + b);

計(jì)數(shù):
        apples.stream().count();

                

使用stream的好處:
1.更簡潔,更易讀
2.可復(fù)合,更靈活
3.可并行

五、Java 8 Optional 類

Optional著重為解決java的NPE問題是Java8提供的為了解決null安全問題的一個(gè)API。善用Optional可以使我們代碼中很多繁瑣、丑陋的設(shè)計(jì)變得十分優(yōu)雅。

使用Optional,我們就可以把下面這樣的代碼進(jìn)行改寫:
public static String getName(User u) {
    if (u == null)
        return "Unknown";
    return u.name;
}

不過,千萬不要改寫成這副樣子。

public static String getName(User u) {
    Optional user = Optional.ofNullable(u);
    if (!user.isPresent())
        return "Unknown";
    return user.get().name;
}

這樣才是正確使用Optional的姿勢。那么按照這種思路,我們可以安心的進(jìn)行鏈?zhǔn)秸{(diào)用,而不是一層層判斷了。
public static String getName(User u) {
    return Optional.ofNullable(u)
                    .map(user->user.name)
                    .orElse("Unknown");
}
看一段代碼:

public static String getChampionName(Competition comp) throws IllegalArgumentException {
    if (comp != null) {
        CompResult result = comp.getResult();
        if (result != null) {
            User champion = result.getChampion();
            if (champion != null) {
                return champion.getName();
            }
        }
    }
    throw new IllegalArgumentException("The value of param comp isn"t available.");
}
讓我們看看經(jīng)過Optional加持過后,這些代碼會(huì)變成什么樣子。
public static String getChampionName(Competition comp) throws IllegalArgumentException {
    return Optional.ofNullable(comp)
            .map(c->c.getResult())
            .map(r->r.getChampion())
            .map(u->u.getName())
            .orElseThrow(()->new IllegalArgumentException("The value of param comp isn"t available."));
}

還有很多不錯(cuò)的使用姿勢,比如為空則不打印可以這么寫:

string.ifPresent(System.out::println);

參考資料:《Java 8 in Action: Lambdas, streams, and functional-style programming》 Raoul-gabriel Urma (作者), Mario Fusco (作者), Alan Mycroft (作者)

作者:文爍
點(diǎn)擊 閱讀更多 查看更多詳情

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73147.html

相關(guān)文章

  • Java8實(shí)戰(zhàn)》-讀書筆記第一章(01)

    摘要:依舊使用剛剛對蘋果排序的代碼。現(xiàn)在,要做的是篩選出所有的綠蘋果,也許你會(huì)這一個(gè)這樣的方法在之前,基本上都是這樣寫的,看起來也沒什么毛病。但是,現(xiàn)在又要篩選一下重量超過克的蘋果。 《Java8實(shí)戰(zhàn)》-讀書筆記第一章(01) 最近一直想寫點(diǎn)什么東西,卻不知該怎么寫,所以就寫寫關(guān)于看《Java8實(shí)戰(zhàn)》的筆記吧。 第一章內(nèi)容較多,因此打算分幾篇文章來寫。 為什么要關(guān)心Java8 自1996年J...

    codeGoogle 評論0 收藏0
  • Java 8 并發(fā)教程:原子變量和 ConcurrentMa

    摘要:并發(fā)教程原子變量和原文譯者飛龍協(xié)議歡迎閱讀我的多線程編程系列教程的第三部分。如果你能夠在多線程中同時(shí)且安全地執(zhí)行某個(gè)操作,而不需要關(guān)鍵字或上一章中的鎖,那么這個(gè)操作就是原子的。當(dāng)多線程的更新比讀取更頻繁時(shí),這個(gè)類通常比原子數(shù)值類性能更好。 Java 8 并發(fā)教程:原子變量和 ConcurrentMap 原文:Java 8 Concurrency Tutorial: Synchroni...

    bitkylin 評論0 收藏0
  • 使用Intellij IDEA 解決Java8的數(shù)據(jù)流問題

    摘要:使用解決的數(shù)據(jù)流問題原文譯者飛龍協(xié)議在年三月發(fā)布,距離現(xiàn)在年三月五號快有一年了。除了,最實(shí)用的特性是新的數(shù)據(jù)流。是吧,注是瀏覽器上的數(shù)據(jù)流的接口,并解決了上述問題。 使用Intellij IDEA 解決Java8的數(shù)據(jù)流問題 原文:Fixing Java 8 Stream Gotchas with IntelliJ IDEA 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 ...

    dreamGong 評論0 收藏0
  • Java 8 API 示例:字符串、數(shù)值、算術(shù)和文件

    摘要:示例字符串?dāng)?shù)值算術(shù)和文件原文譯者飛龍協(xié)議大量的教程和文章都涉及到中最重要的改變,例如表達(dá)式和函數(shù)式數(shù)據(jù)流。不僅僅是字符串,正則表達(dá)式模式串也能受益于數(shù)據(jù)流。 Java 8 API 示例:字符串、數(shù)值、算術(shù)和文件 原文:Java 8 API by Example: Strings, Numbers, Math and Files 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 ...

    KavenFan 評論0 收藏0
  • Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強(qiáng))

    摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...

    Scorpion 評論0 收藏0

發(fā)表評論

0條評論

microcosm1994

|高級講師

TA的文章

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