1. 程式人生 > 實用技巧 >lambda VS 匿名類 節選1

lambda VS 匿名類 節選1

  • lambda是函數語言程式設計.很多語言中,函式(方法)是一等公民,無需依附於任何其它元素即可存在,並可以作為引數和返回值.而Java中只有類是一等公民,方法必須依附於某個類.
    Java現在也支援lambda了
  • 看例程: 兩種方式遍歷List,遍歷Map
  • 看例程: lambda相當於是Java通過一頓後臺操作幫我們生成了一個類來實現介面,並呼叫我們提供的方法
  • 看例程: 使用stream和collector,理解lambda的美
  • 看例程: lambda可以有返回值和異常

兩個靜態方法


    public static List<String> addElementsToList(List<String> list) {
        for (int i = 0; i < 22; i++) {
            list.add("str" + i);
        }
        return list;
    }

    private static void processString(String str) {
        System.out.println(str);
    }

普通輸出集合方式

        List<String> myList = addElementsToList(new ArrayList<>());
        String outside = "outside string";

        for (String s : myList) {
            processString(outside + s);
        }

匿名內部類版本

        // TODO 匿名內部類版
        myList.forEach(
                new Consumer<String>() {
                    @Override
                    public void accept(String s) {
                        processString(outside + s);
                    }
                }
        );

lambda完整版

        // TODO lambda的表示式必須能夠符合介面中定義的抽象方法,從引數,到返回值,到異常,都必須匹配

        // TODO lambda 完整版 (引數) -> {程式碼塊}
        // TODO lambda可以有返回值,使用return語句就可以,當然我們這個介面沒有,我們的lambda表示式也不能有
        // TODO lambda可以使用外部資料,怎麼看都和匿名內部類是一樣的
        myList.forEach(
                (s) -> {
                    processString(outside + s);
                }
        );

lambda簡化版,去除了引數後大括號

        // TODO lambda 單引數,程式碼單行 簡化版,
        myList.forEach(s -> processString(outside + s));

lambda終極版,如果不使用外部變數

        // TODO lambda 如果不使用外部變數,還有方法引用終極簡化版
        myList.forEach(IterateListLambdaAppMain::processString);

lambda終極版,不是靜態方法的話


        // TODO lambda 方法引用終極簡化版:不是靜態方法,用引用也可以
        IterateListLambdaAppMain inst = new IterateListLambdaAppMain();
        myList.forEach(inst::processStringInst);

        private void processStringInst(String str) {
              System.out.println(str);
        }
        // TODO lambda也允許指定一個引數型別裡的一個方法作為方法的引用
        myList.forEach(String::toUpperCase);