我正參加2016CSDN博客之星的比賽 但願您能投下寶貴的一票,點擊進入投票html
咱們來看個接口和一個方法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
一樣的看一個接口和他的實現方法
接口:
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();
});
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
}
參考文獻1
此Api位於
java.util.stream.Stream
是之前集合list ArraysList等升級版 更高效的操做這裏只教怎麼用 具體你們能夠看上面的鏈接
集合轉爲stream
List<String> data = Arrays.asList("5","4","0","1");
Stream<String> stream = data.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介紹