[USACO07DEC]Mud Puddles S 題目描述 Farmer John is leaving his house promptly at 6 AM for his daily milking of Bessie. However, the previous evening saw a ...
Lambda是JDK1.8新引進的簡化代碼語法格式,可以替代匿名內部類。
//以下代碼對比一下兩者寫法上的區別
interface Alarm{
void display();
}
public class Lambda{
public static void main(String[] args){
Alarm a=new Alram(){
@Override
public void display(){
System.out.println("我是匿名內部類實現的方法");
}
}
//簡化代碼
Alram b=()->System.out.println("我是lambda表達式實現的方法");
}
}
Lambda語法
介面 變數名=(參數名稱以及個數)->{實現方法};
函數式介面:
- 保證是介面
- 只能有一個抽象方法(public abstract可預設)
- 聲明@FunctionalInterface註解 幫助開發人員判定是否滿足函數式介面定義 可不寫但需要你滿足上兩條
- 函數式介面中可以定義常量(public final可預設)
- 函數式介面中可以寫預設方法 但是Lambda表達式無法訪問該方法
//聲明該介面為函數式介面
@FunctionalInterface
interface AlarmNoArg{
void display();
}
@FunctionalInterface
interface AlarmOneArg{
String display(String one);
}
@FunctionalInterface
interface AlarmTwoArg{
public final int arg=1;
public abstract int display(int a,int b);
}
interface AlarmThreeArg{
defalut void m1(){
//邏輯
}
void display(int[] arr);
}
public class Example{
public static void main(String[] args){
AlarmNoArg a=()->System.out.prinln("一行代碼可以省略{}");
a.display();
AlarmOneArg b=(name)->name;
//一行代碼預設{}情況下 可以直接返回值
b.display("張三");
//兩個參數 參數名隨便寫 符合java變數名規範就行
//返回值不是void 寫結構體{}必須寫return
AlarmTwoArg c=(a,b)->{return a+b;};
c.display(1,2);
//數組引用
AlarmThreeArg d=(arr)->{
for(int i:arr){
System.out.println(i);
}
};//分號別忘啦
d.display(new int[]{1,2,3,4})
}
}
::運算符的使用
保證方法參數數量/順序/返回值一致 否則編譯錯誤
@FunctionalInterface
interface Lam1{
int sum(int a,int b);
}
interface Lam2{
String get();
}
interface Lam3{
Example create(String name,int age);
}
class Example{
public static int isSum(int m,int n){
return m+n;
}
public String getName(){
return "馬齊";
}
public Example1(String name,int age){
this.name=name;
this.age=age;
}
public Example1(){}
public static void main(String[] arg){
//綁定靜態方法
Lam1 a=Example::isSum;
a.sum(1,2);
//綁定實例方法
Example obj=new Example();
Lam2 b=obj::getName;
b.get();
//綁定構造方法
Lam3 c=Example::new;
Example e=c.create("張三",21);
}
}