基于Java8的Lambda表達(dá)式(1)

本篇基于Java8演示工作中接觸的Lambda表達(dá)式用法。
描述一個(gè)代碼場(chǎng)景,先展示之前的一般寫法,然后再用Lambda表達(dá)式寫一遍。

0.1 Java8下載

JDK8下載
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

0.2 代碼場(chǎng)景1

有一組雙十一來自各個(gè)渠道的銷售量數(shù)據(jù)集合,
現(xiàn)在為了在報(bào)表上顯示,需要把數(shù)據(jù)按銷售量從高到底顯示。

package com.lambda;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class TestLambda {

        public static void main(String[] args) {
            List<Sales> salesList = new ArrayList<>();
            salesList.add(new Sales("天貓", 1000));
            salesList.add(new Sales("京東", 8000));
            salesList.add(new Sales("亞馬遜", 200));
            salesList.add(new Sales("大潤(rùn)發(fā)", 600));
            salesList.add(new Sales("歐尚", 800));

            //想達(dá)到的目的:獲取銷量從高到低的渠道名稱集合:
            //1.京東     8000
            // 2.天貓    1000
            // 3.歐尚    800
            // 4.大潤(rùn)發(fā)  600
            // 5.亞馬遜  200

            //1. 傳統(tǒng)方法
            Collections.sort(salesList, saleCountComparator);
            for(Sales s : salesList) {
                System.out.println(s.getChannelName()+" "+s.getSaleCount());
            }

            //2. lambda方法(獲取排序后的對(duì)象集合)
            List<Sales> list2 = salesList.stream()
                    .sorted((o1,o2) -> {
                        return o2.getSaleCount() - o1.getSaleCount();
                    })
                    .collect(Collectors.toList());

            for(Sales s : list2) {
                System.out.println(s.getChannelName()+" "+s.getSaleCount());
            }

            //3. lambda方法(獲取排序后的渠道名稱集合)
            List<String> list3 = salesList.stream()
                    .sorted((o1,o2) -> {
                        return o2.getSaleCount() - o1.getSaleCount();
                    })
                   //map:一對(duì)一轉(zhuǎn)換   輸入一個(gè)對(duì)象(Sales) 轉(zhuǎn)換為 一個(gè)對(duì)應(yīng)的渠道名稱(String)
                    .map(Sales::getChannelName)    
                    .collect(Collectors.toList());

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

        public static Comparator saleCountComparator = new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
               //o2在前,降序排列
                return ((Sales)o2).getSaleCount() - ((Sales)o1).getSaleCount(); 
            }
        };
    }

class Sales {
    private String channelName;
    private Integer saleCount;

    public Sales(String channelName, Integer saleCount) {
        this.channelName = channelName;
        this.saleCount = saleCount;
    }

    public String getChannelName() {
        return channelName;
    }

    public void setChannelName(String channelName) {
        this.channelName = channelName;
    }

    public Integer getSaleCount() {
        return saleCount;
    }

    public void setSaleCount(Integer saleCount) {
        this.saleCount = saleCount;
    }
}
0.3 代碼說明

以上代碼的關(guān)鍵是lambda寫法的stream、sorted、map

  • stream
    它和以往文件等輸入輸出流的stream完全兩個(gè)概念,
    它能夠?qū)蠈?duì)象進(jìn)行各種串行或并發(fā)聚集操作,
    響應(yīng)了現(xiàn)在多核處理器的需求。
  • sorted
    sorted函數(shù)需要傳入一個(gè)實(shí)現(xiàn)Comparator函數(shù)式接口的對(duì)象,
    該接口的抽象方法compare接收兩個(gè)參數(shù)并返回一個(gè)整型值,
    作用就是排序,因?yàn)樽隽司?jiǎn),所以代碼上比傳統(tǒng)的精簡(jiǎn)很多:
.sorted((o1,o2) ->  o2.getSaleCount() - o1.getSaleCount())

以上是精簡(jiǎn)的寫法,但是我個(gè)人習(xí)慣加上{},可讀性可能會(huì)好些:

.sorted((o1,o2)  -> {
                        return o2.getSaleCount() - o1.getSaleCount();
                    })
  • map
    map函數(shù)需要傳入一個(gè)實(shí)現(xiàn)Function函數(shù)式接口的對(duì)象,
    該接口的抽象方法apply接收一個(gè)參數(shù)并返回一個(gè)值,
    可以理解為映射關(guān)系,上面的代碼就是將每一個(gè)Sales對(duì)象映射為一個(gè)channelName的String對(duì)象
.map(Sales::getChannelName)

(注意語法,中間是2個(gè)冒號(hào),類似C++的方法調(diào)用)


寫本文僅僅是為了演示Lambda表達(dá)式的常用寫法,至于可讀性、可維護(hù)性、性能高低等方面,大家根據(jù)實(shí)際情況去判斷吧。
由于作者水平有限,難免出現(xiàn)紕漏,如有問題請(qǐng)幫忙指正,謝謝!

下一篇 基于Java8的Lambda表達(dá)式(2)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容