Lamda表達式學習


Lamda表達式學習

參考:

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的局部變量的影響

安卓中引入lamda

參看參考文章

lamda主要使用的規則

它可以替代的地方必須是“函數式接口”

函數式接口代表的一種契約,一種對某個特定函數類型的契約。在它出現的地方,實際期望一個符合契約要求的函數。 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

jdk8新增的函數式接口:

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");

Lamda語法:

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;

   };

}

在使用lamda需要注意的問題:

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才能用。

 

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com