lambda運算式
lambda可以看作是匿名方法

函式式介面
一個介面有且只有一個抽象方法
- 可以有成員變數
- 函式式介面允許定義頂層父類Object類里面的public方法
- 可以定義靜態方法,這個靜態方法一定要有方法體
- 可以有Default方法
可以在介面上添加注釋@FunctionalInterface,編譯器就會自動檢測,按函式式介面的定義要求此介面
@FunctionalInterface
interface Lambda{
void Test();
static void func1(){
}
default void func2(){
}
public void boolean equals();
}
Lambda運算式的使用
public static void main(String[] args) {
Lambda lambda = new Lambda() {
@Override
public void Test() {
System.out.println("good job");
}
};
lambda.Test();
Lambda lambda1 = () -> System.out.println("good job");
lambda1.Test();
}
@FunctionalInterface
interface Lambda1{
void Test(int a);
}
Lambda1 lambda11 = (int a) -> System.out.println(a);
Lambda1 lambda12 = a -> System.out.println(a);
@FunctionalInterface
interface Lambda2{
void Test(int a,int b);
}
Lambda2 lambda2 = (int a,int b) -> System.out.println(a+b);
Lambda2 lambda21 = (a,b) -> System.out.println(a+b);
@FunctionalInterface
interface Lambda3{
int Test();
}
Lambda3 lambda3 = () -> {return 10;};
Lambda3 lambda31 = () -> 10;
@FunctionalInterface
interface Lambda4{
int Test(int a);
}
Lambda4 lambda4 = (int a) -> {return a;};
Lambda4 lambda41 = a -> a;
System.out.println(lambda41.Test(10)); //10
@FunctionalInterface
interface Lambda5{
int Test(int a,int b);
}
Lambda5 lambda5 = (int a,int b) -> {return a+b;};
Lambda5 lambda51 = (a,b) -> a+b;
System.out.println(lambda51.Test(10,2)); //12
Lambda使用場景
Lambda運算式只適用于函式式介面
abstract class Player{
abstract void func();
}
//匿名內部類
Player player = new Player(){
@Override
void func() {
System.out.println("匿名內部類來了");
}
};
player.func();
//Lambda運算式實作但是不行,翻譯過來是Lambda運算式必須是代替一個介面的
Player player1 = () -> System.out.println("匿名內部類來了");

變數捕獲
匿名內部類的變數捕獲
捕獲的變數必須是一個常量或者是沒有改變過的變數
class Test{
public void func(){
System.out.println("func()");
}
}
public class TestDemo {
public static void main(String[] args) {
int a = 10;
//a = 99; //No
new Test(){
@Override
public void func() {
//a = 99; //No
System.out.println("我是內部類,且重寫了func()方法");
System.out.println(a);
}
};
}
}
Lambda的變數捕獲
int a =10;
Lambda lambda1 = () -> {System.out.println("good job");
System.out.println(a);};
lambda1.Test(); //good job
//10
Lambda在集合中使用
列舉List 和 Map 中的forEach()方法
forEach()遍歷集合元素
List中的forEach()

public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(5);
list.add(8);
list.add(10);
list.add(9);
list.add(2);
//匿名內部類
list.forEach(new Consumer() {
@Override
public void accept(Object o) {
System.out.print(o + " ");
}
});
//Lambda運算式
list.forEach((o) -> System.out.print(o + " "));
}
Map的forEach()方法

HashMap<Integer,String> map = new HashMap<>();
map.put(1,"chao");
map.put(2,"yue");
map.put(3,"xiao");
map.put(4,"qiang");
map.put(5,"yu");
//匿名內部類
map.forEach(new BiConsumer<Integer, String>() {
@Override
public void accept(Integer integer, String s) {
System.out.println("Integer:"+integer+" "+"String:"+s);
}
});
//Lambda運算式
map.forEach((integer, s) -> System.out.println("Integer:"+integer+" "+"String:"+s));
List的Sort()方法
list.sort(new Comparator<Integer>() {
@Override
//從小到大
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
list.sort((o1, o2) -> o1-o2);

祝賀EDG3:2戰勝DK登頂世界之巔
銀龍重鑄之日,騎士歸來之時
重鑄LPL榮光,我輩義不容辭

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/352268.html
標籤:其他
上一篇:線性表--動態順序表
下一篇:【演算法入門13】樹的子結構
