java 8 lambda 申明_2019-02-03——Java8 Lambda
一.認識Lambda
Lambda表達式專門針對只有一個方法的接口(即函數式接口)
lambda表達式的基本格式為(x,y...)—>{表達式...};
(1)可選類型聲明:不需要聲明參數類型,編譯器可以統一識別參數值。
(2)可選的參數圓括號:一個參數無需定義圓括號,但多個參數需要定義圓括號。
(3)可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
(4)可選的返回關鍵字:如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定明表達式返回了一個數值。
在我的理解看來更像是實現一個函數式接口; x,y...表示抽象方法的入參數,表達式實際上是抽象的具體實現,
比如:
首先定義了一個函數式接口:
public interface Operation{
int operator(int x,int y);
}
其次定義一個方法,入參為該接口類型
public class Test{
public void t(Operation o){
o.operator(x,y);
}
}
最后調用t方法的方式:
第一種,也是最古老的一種傳入一個Operation接口的實現
public void m(){
t(new Operation(){
@Override
public int operator(int x,int y){
return x*x+y*y;
}
});
}
2.第二種,使用lambda表達式
public void m(){
t((x,y)->x+y);
}
3.第三種,也就是方法引用
(1)首先需要一個方法
public class Other{
public static int other(int m,int n){
return m*n;
}
}
(2)其次在t方法中進行方法引用
public void m(){
t(Other::other);
}
最終的效果就是:
public void m(){
t(new Operation() {
@Override
public int operator(int x, int y) {
return x*x+y*y;
}
});
t((x,y)->x+y);
t(Other::other);
}
比較一下Other類的other方法和Operation接口的operator方法可以看出兩個方法都是傳入兩個int型參數返回一個int類型的值。
我覺得Java8的函數式編程打破了以往的束縛,在以往方法定義了一個類型的入參,在調用方法的時候必須傳入該類型的實例。但是函數式接口卻打破了這一約束,把函數式接口當作形參感覺更像是傳入方法的實現而非接口的實現
Lambda表達式并非是方法的實現
對于方法的引用我們可以換個寫法
public void m(){
t((x,y)->Other.other(x,y));
}
如果不夠清晰可以在定義一個方法
public static String another(int x,int y,int z){
return (x*y*z)+"";
}
對該方法的引用如下
public void m(){
t((x,y)->{
String another = Other.another(x, y, 10);
return Integer.parseInt(another);
});
}
通過這個寫法可以看出對方法的引用其實是一種對接口實現的簡化。
(1)簡化了方法調用
(2)簡化了返回值
(3)簡化了大括號
最后在比較一下幾種調用方式:
public void m(){
t(new Operation() {
@Override
public int operator(int x, int y) {
return x*x+y*y;
}
});
t((x,y)->x+y);
t(Other::other);
t((x,y)->Other.other(x,y));
t((x,y)->{
String another = Other.another(x, y, 10);
return Integer.parseInt(another);
});
}
總結
以上是生活随笔為你收集整理的java 8 lambda 申明_2019-02-03——Java8 Lambda的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华师计算机基础在线作业秋,18秋华师《计
- 下一篇: R语言smoothHR包_SmoothH