參考:
http://blog.csdn.net/xmxkf/article/details/51532028#3-函數式接口functional-interfaces
http://colobu.com/2014/10/28/secrets-of-java-8-functional-interface/
http://www.cnblogs.com/ownraul/p/5551545.html
Lamda表達式是java SE 8 中出來的。主要針對的是由於內部類帶來的冗余語法的問題。
Eg:
textView.setOnClickListener(newView.OnClickListener(){
@Override
publicvoid onClick(View v) {
Toast.makeText(getApplicationContext(), "helloLambda", Toast.LENGTH_LONG).show();
}
});
經過處理之后為:
textView.setOnClickListener(
v -> Toast.makeText(getApplicationContext(),"Lambda", Toast.LENGTH_LONG).show());
因此,我們引入lamda語法主要要解決匿名內部類的:
1、 語法過於冗余
2、 類型載入和實例創建語義不夠靈活(也就是泛型問題)
3、 減少了無法捕獲非final的局部變量的影響
參看參考文章
它可以替代的地方必須是“函數式接口”。
函數式接口代表的一種契約,一種對某個特定函數類型的契約。在它出現的地方,實際期望一個符合契約要求的函數。 Lambda表達式不能脫離上下文而存在,它必須要有一個明確的目標類型,而這個目標類型就是某個函數式接口:SAM類型的接口(Single Abstract Method)
l java.lang.Runnable
l java.util.concurrent.Callable
l java.security.PrivilegedAction
l java.util.Comparator
l java.io.FileFilter
l java.nio.file.PathMatcher
l java.lang.reflect.InvocationHandler
l java.beans.PropertyChangeListener
l java.awt.event.ActionListener
l javax.swing.event.ChangeListener
l Predicate -- 傳入一個參數,返回一個bool結果,方法為boolean test(T t)
l Consumer -- 傳入一個參數,無返回值,純消費。方法為void accept(T t)
l Function -- 傳入一個參數,返回一個結果,方法為R apply(T t)
l Supplier -- 無參數傳入,返回一個結果,方法為T get()
@FunctionalInterface
interface Converter<F, T> {
Tconvert(F from);
}
使用:
Converter<String, Integer> converter= (from) -> Integer.valueOf(from);
Integer converted =converter.convert("123");
ambda表達式的語法由參數列表、箭頭符號->和函數體組成
無參數:
Interface3 in31 = ()-> {
Log.v(TAG, "吃飯了嗎");
returntrue;
};
一個參數
Interface2 in21 = name->{
Log.v(TAG,"有這個人嗎?");
Log.v(TAG,"沒有啊");
returnfalse;
};
多個參數
Interface1 in2 = (name, age, addr) ->{
Log.v(TAG,"有這個人嗎?");
Log.v(TAG,"沒有啊");
returnfalse;
};
多個參數並賦予類型:
private void lambda3(){
Interface1 in1 = (String name, int age, String addr)->{
Log.v(TAG, "有這個人嗎?");
Log.v(TAG, "沒有啊");
return false;
};
}
1、它不會從父類(supertype)中繼承任何變量名,也不會引入一個新的作用域。lambda表達式函數體里面的變量和它外部環境的變量具有相同的語義。
class Activity{
button.setOnClickListener(v->{this.finish();})
}
this代表的是Activity對象,而不是OnClickListener對象;
如果你寫成下面的樣子:
class Activity{
button.setOnClickListener(new OnClickListener(View v){
this.xxx()
});
}
這個this就是指的OnClickListener這個匿名對象,如果你要用Activity對象,必須用Activity.this
2、不必再像內部內一樣在用到外部的變量時還要轉化為final才能用。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。