Java 8新特性:新語法方法引用和Lambda表達式及全新的Stream API

我正參加2016CSDN博客之星的比賽 但願您能投下寶貴的一票,點擊進入投票html

新語法

方法引用(Method references)

咱們來看個接口和一個方法java

public class TestMain {


    interface A{
        String a(int a,int b);
    }

    static String hello(int a,int b){
        return "";
    };
}

假設咱們這裏要實現A接口
通常是直接內部類 或者新建一個類去實現android

//咱們日常的實現方法
        A a = new A() {

            @Override
            public String a(int a, int b) {

                return null;
            }
        };

那咱們來看看用」方法引用」的方式api

A a2 = TestMain::hello;

是否是很簡潔?bash

來咱們看看這種語法的規則
AAA::BBB
AAA指代某個類
BBB指代某個方法
BBB中的方法必須和你實現的接口回調的參數返回值一致markdown

就拿咱們本例中的案例能夠A接口中抽象方法 String a(int a,int b);
咱們能夠看到這個返回值是—String 參數爲—-int—-intapp

而後再看看咱們TestMain類下的String hello(int a,int b)方法
返回值是—-String 參數是—int—int
當使用 ‘方法引用’ 時候我自動傳入參數ide

再來看個案例gradle

List<String> data = Arrays.asList("2","1","4");
        //forEach後面會解釋 你們主要看一下他的接口實現
        data.forEach(new Consumer<String>() {

            @Override
            public void accept(String t) {
            System.out.println(t);

            }
        });

再看看用新語法怎麼實現ui

List<String> data = Arrays.asList("2","1","4");
    //forEach後面會解釋 你們主要看一下他的接口實現
    data.forEach(System.out::printf);

上面兩個效果是同樣的 都是輸出 2 1 4
System.out 是 java.lang.System.out中的一個類
printf 是System.out中的一個方法
咱們來看下這個printf方法

public void println(String x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

能夠看到傳入值一個字符串 返回值爲void

咱們再來看下forEach中的匿名內部類

data.forEach(new Consumer<String>() { @Override public void accept(String t) { }
        });

傳入的是一個String 返回的是void 因此正好可使用System.out.println

Lambda語法

一樣的看一個接口和他的實現方法
接口:

public class TestMain {
    interface A{
        String a(int a,int b);
    }
}

來看看吧咱們實現的方法

//咱們日常的實現方法
        A a = new A() {

            @Override
            public String a(int a, int b) {

                return null;
            }
        };

Lambda語法實現

//直接返回字一個字符串
        A a2 = (aa,b)->{return "";};
        //計算aa+b的數值 而後轉化爲字符串返回
        A a3 = (int aa,int b)->{String s=(aa+b)+"";return s;};
        //至關於直接返回
        A a4 = (int aa,int b)-> "我不想計算aa+b的值";

        //若是A接口中a方法沒有參數也沒有返回值假如抽象方法爲void a();
        A a2 = ()->{};

Lambda語法
1. (aa,bb)->」「;
aa 抽象方法的第一個參數 自動會按順序賦值
bb抽象方法的第二個參數 自動會按順序賦值
「」 抽象方法的返回值 至關於 return 「」
2. (int aa,float bb)->」」
aa 抽象方法的第一個參數而且類型爲int 自動會按順序賦值
bb抽象方法的第二個參數而且類型爲float自動會按順序賦值
「」 抽象方法的返回值 至關於 return 「」
這裏的類型能夠根據你的抽象方法肯定
3. (aa,bb)->{
System.out.println(「嘿嘿傳入的數值a = 「+aa);
return 「」;
}
aa 抽象方法的第一個參數 自動會按順序賦值
bb抽象方法的第二個參數 自動會按順序賦值
{} 方法體能夠在裏面執行語句最後再返回
4. (int aa,int bb)->{
System.out.println(「嘿嘿傳入的數值a = 「+aa);
return 「」;
}
和」3」同樣 只不過指定了參數
5. ()->{ }
抽象接口沒有參數返回值爲void

案例1:
原版:

FileFilter java = new FileFilter() {

            @Override
            public boolean accept(File pathname) {

                return false;
            }
        };

lambda

FileFilter java2 = (file)-> true;

在android中的一個案例:

ImageView iv  =(ImageView)findViewById(R.id.iv);
            iv.setOnClickListener(view -> {
                Toast.makeText(this,"你的內容",Toast.LENGTH_SHORT).show();
                Toast.makeText(this,"你的內容",Toast.LENGTH_SHORT).show();
            });

Lambda語法在AndroidStudio中報錯

能夠點擊查看原文

1.首先先項目根目錄下的build.gradle中加入(注意加黑字)as2.0之後版本用3.4

classpath 'me.tatarka:gradle-retrolambda:3.2.0'

2.而後再module目錄下的build.gradle中使用插件(放在第一行就行),加入

apply plugin: 'me.tatarka.retrolambda'

3.jmodule目錄下的build.gradle中android語段中加入

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

Stream API

參考文獻1
此Api位於
java.util.stream.Stream
是之前集合list ArraysList等升級版 更高效的操做這裏只教怎麼用 具體你們能夠看上面的鏈接

  1. 集合轉爲stream

    List<String> data = Arrays.asList("5","4","0","1");
    Stream<String> stream = data.stream();
  2. stream變爲集合
List<String> data = Arrays.asList("5","4","0","1");
        Stream<String> stream = data.stream();
        List<Object> asList = Arrays.asList(stream.toArray());
List<String> data = Arrays.asList("5","4","0","1");
        Stream<String> stream = data.stream();
        stream.collect(Collectors.toList());

關於collect 能夠看下這篇文章
collect介紹

相關文章
相關標籤/搜索