奉節(jié)做網(wǎng)站軟文營銷的技巧
Lambda表達(dá)式
簡介
Lambda是一個(gè)匿名函數(shù)(方法), 允許把函數(shù)作為一個(gè)方法的參數(shù) 。利用Lambda表達(dá)式可以寫出更簡潔、更靈活的代碼。作為一種更緊湊的代碼風(fēng)格,使Java的語言表達(dá)能力得到了提升。一般都是優(yōu)化匿名內(nèi)部類
基礎(chǔ)語法
無參數(shù)、無返回值的抽象方法
public class Test1 {@Testpublic void test01() {
// I1 i1 = new I1() {
// @Override
// public void method() {
// System.out.println("傳統(tǒng)使用匿名內(nèi)部類的方式");
// }
// };
// i1.method();I1 i1 = ()-> System.out.println("采用Lambda表達(dá)式的方式");i1.method();}
}
interface I1{public void method();//無參數(shù)、無返回值的抽象方法
}
一個(gè)參數(shù)、無返回值的抽象方法
public class Test1 {@Testpublic void test01() {I1 i1 = (x)-> System.out.println("采用Lambda表達(dá)式的方式 " + x);i1.method(1000);}
}
interface I1{public void method(int num1);//一個(gè)參數(shù)、無返回值的抽象方法
}
多個(gè)參數(shù)、無返回值的抽象方法
public class Test1 {@Testpublic void test01() {I1 i1 = (x,y,z)-> System.out.println("采用Lambda表達(dá)式的方式 " + x + y + z);i1.method(1000,2000,3000);}
}
interface I1{//多個(gè)參數(shù)、無返回值的抽象方法public void method(int num1,int num2,int num3);
}
多個(gè)參數(shù)、有返回值的抽象方法
public class Test1 {@Testpublic void test01() {I1 i1 = (x,y,z)-> x+y+z;int result = i1.method(1000,2000,3000);System.out.println(result);}
}
interface I1{//多個(gè)參數(shù)、有返回值的抽象方法public int method(int num1,int num2,int num3);
}
注意點(diǎn)
- 重寫方法的形參只有一個(gè)時(shí),可以不加小括號(hào)
- Lambda表達(dá)式當(dāng)中不允許聲明一個(gè)與局部變量同名的參數(shù)或者局部變量
- Lambda表達(dá)式中訪問外層的局部變量,外層的局部變量自動(dòng)變成隱式常量,默認(rèn)添加final
- 重寫方法的形參同時(shí)加類型或同時(shí)不加類型
public class Test1 {@Testpublic void test01() {int x;int num = 10;I1 i1 = x -> System.out.println(x + (num++));i1.method(1000);I2 i2 = (int x,int y) -> {int result = x+y;return result;};int result = i2.method(10, 20);System.out.println(result);}
}
interface I1{public void method(int num1);
}
interface I2{public int method(int num1,int num2);
}
練習(xí)
- 調(diào)用Collections.sort()方法,通過定制排序比較兩個(gè)Student對(duì)象(先按年齡比較,年齡相同按照薪資比較),使用Lambda表達(dá)式作為參數(shù)傳遞
public class Test1 {@Testpublic void test01() {List<Student> stuList = Arrays.asList(new Student("張三", 28, 4800,Course.JAVA),new Student("李四", 36, 7200,Course.JAVA),new Student("王五", 19, 9600,Course.HTML),new Student("趙六", 42, 6100,Course.HTML),new Student("孫七", 23, 9600,Course.PYTHON),new Student("吳八", 31, 3000,Course.PYTHON));Collections.sort(stuList, (a,b)-> {if(a.getAge() == b.getAge()){return Double.compare(a.getSalary(),b.getSalary());}return a.getAge()-b.getAge();});for (Student stu : stuList) {System.out.println(stu);}}
}
enum Course{//課程枚舉JAVA,HTML,PYTHON;
}
class Student{//學(xué)生類private String name;private int age;private double salary;private Course course;...
}
- 創(chuàng)建I1接口,創(chuàng)建抽象方法:public String getValue(String str),在測試類中編寫方法使用接口作為參數(shù),將一個(gè)字符串轉(zhuǎn)為大寫,并作為方法的返回值
public class Test1 {@Testpublic void test01() {String strHandler = strHandler("abc", x-> x.toUpperCase());System.out.println(strHandler);}public static String strHandler(String str,I1 i1){return i1.getValue(str);}
}
interface I1{public String getValue(String str);
}
- 創(chuàng)建I1<T,R>接口,泛型T為參數(shù),R為返回值,創(chuàng)建抽象方法:public R add(T t1,T t2),在測試類中編寫方法使用接口作為參數(shù),計(jì)算兩個(gè)long類型的和
public class Test1 {@Testpublic void test01() {Long addLong = addLong(100L, 200L, (x,y)-> x+y);System.out.println(addLong);}public static Long addLong(Long l1,Long l2,I1<Long,Long> i1){return i1.add(l1, l2);}
}
interface I1<T,R>{public R add(T t1,T t2);
}