前言
lamda表達(dá)式只支持函數(shù)式接口。
- Lambda 表達(dá)式是 JDK8 的一個(gè)新特性,可以取代大部分的匿名內(nèi)部類,寫出更優(yōu)雅的 JAVA 代碼,尤其在集合的遍歷和其他集合操作中,可以極大地優(yōu)化代碼結(jié)構(gòu)。
- 為啥要突然插播一個(gè)lamda表達(dá)式的學(xué)習(xí),因?yàn)檫@玩意很有逼格呀~代碼寫起來更有大佬的感覺。
一、函數(shù)式接口
什么是函數(shù)式接口?
任何一個(gè)接口,有且只有 一個(gè)抽象方法,那么它就是函數(shù)式接口。
典型的函數(shù)式接口
public interface mainInterface {
void funMethod();
}
對于函數(shù)式接口,我們可以用lamda表達(dá)式來創(chuàng)建他的實(shí)現(xiàn)對象。
二、接口的五種實(shí)現(xiàn)方式
①正常類實(shí)現(xiàn)
代碼案例:
/**
* 1.正常接口實(shí)現(xiàn)類
*/
class FunInterImpl implements FunInter{
//重寫該方法
@Override
public void method(String name) {
System.out.println("我是實(shí)現(xiàn)類中的重寫方法:"+name);
}
}
②靜態(tài)內(nèi)部類實(shí)現(xiàn)
//2、靜態(tài)內(nèi)部類實(shí)現(xiàn)
static class FunInterImpl implements FunInter{
@Override
public void method(String name) {
System.out.println("我是實(shí)現(xiàn)類中的重寫方法:"+name);
}
}
③局部內(nèi)部類實(shí)現(xiàn)
//3.局部內(nèi)部類
class FunInterImpl2 implements FunInter{
@Override
public void method(String name) {
System.out.println("我是實(shí)現(xiàn)類中的重寫方法:"+name);
}
}
④匿名內(nèi)部類實(shí)現(xiàn)
//4.匿名內(nèi)部類,要一分號;結(jié)尾
FunInter funInter2 = new FunInter() {
@Override
public void method(String name) {
System.out.println("我是實(shí)現(xiàn)類中的重寫方法:"+name);
}
};
⑤lamda表達(dá)式實(shí)現(xiàn)
//5.lamda表達(dá)式實(shí)現(xiàn)
FunInter funInter3 = (String name) ->{
System.out.println("我是實(shí)現(xiàn)類中的重寫方法:"+name);
};
整體代碼:
public class NoReturnMultiParam {
public static void main(String[] args) {
//1.正常實(shí)現(xiàn)接口的方式
FunInterImpl funInter = new FunInterImpl();
funInter.method("1、實(shí)現(xiàn)類");
System.out.println("***************************************");
//2、靜態(tài)內(nèi)部類實(shí)現(xiàn)
FunInterImpl funInter1 = new FunInterImpl();
funInter.method("2、靜態(tài)內(nèi)部類");
System.out.println("***************************************");
//3.局部內(nèi)部類
class FunInterImpl2 implements FunInter{
@Override
public void method(String name) {
System.out.println("我是實(shí)現(xiàn)類中的重寫方法:"+name);
}
}
FunInterImpl2 funInterImpl2 = new FunInterImpl2();
funInterImpl2.method("3、局部內(nèi)部類");
System.out.println("***************************************");
//4.匿名內(nèi)部類,要一分號;結(jié)尾
FunInter funInter2 = new FunInter() {
@Override
public void method(String name) {
System.out.println("我是實(shí)現(xiàn)類中的重寫方法:"+name);
}
};
funInter2.method("4、匿名內(nèi)部類");
System.out.println("***************************************");
//5.lamda表達(dá)式實(shí)現(xiàn)
FunInter funInter3 = (String name) ->{
System.out.println("我是實(shí)現(xiàn)類中的重寫方法:"+name);
};
funInter3.method("5.lamda表達(dá)式實(shí)現(xiàn)");
}
//2、靜態(tài)內(nèi)部類實(shí)現(xiàn)
static class FunInterImpl implements FunInter{
@Override
public void method(String name) {
System.out.println("我是實(shí)現(xiàn)類中的重寫方法:"+name);
}
}
}
/**
* 這個(gè)注解是用來標(biāo)注函數(shù)式接口的
* 1.必須注解在接口上
* 2.被注解的接口有且只有一個(gè)抽象方法
* 3.被注解的接口可以有默認(rèn)方法/靜態(tài)方法,或者重寫Object的方法
*/
@FunctionalInterface
interface FunInter{
void method(String name);
}
/**
* 1.正常接口實(shí)現(xiàn)類
*/
class FunInterImpl implements FunInter{
//重寫該方法
@Override
public void method(String name) {
System.out.println("我是實(shí)現(xiàn)類中的重寫方法:"+name);
}
}
執(zhí)行結(jié)果如下:
三、lamda表達(dá)式
實(shí)現(xiàn)方式:
public class lamdaTest01 {
public static void main(String[] args) {
/**
* 多參數(shù)無返回
*/
NoReturnMultiParam1 n1 = (int a,int b) ->{
System.out.println("多參數(shù)無返回:"+a+b);
};
n1.method(1,2);
/**
* 無參無返回值
*/
NoReturnNoParam n2 = ()->{
System.out.println("無參無返回值");
} ;
n2.method();
/**
* 一個(gè)參數(shù)無返回
*/
NoReturnOneParam n3 = (int a) -> {
System.out.println("一個(gè)參數(shù)無返回" + a);
};
n3.method(11);
/**
* 多個(gè)參數(shù)有返回值
*/
ReturnMultiParam n4 = (int a,int b)->{
System.out.println("多個(gè)參數(shù)有返回值" + a);
return 1;
};
System.out.print("****"+n4.method(1, 3));
/**
* 無參有返回
*/
ReturnNoParam n5 = ()->{
System.out.println("無參有返回");
return 1;
};
System.out.print("***"+n5.method());
/**
* 一個(gè)參數(shù)有返回值
*/
ReturnOneParam n6 = (int a) ->{
System.out.println("一個(gè)參數(shù)有返回值"+a);
return a;
};
System.out.print("***"+n6.method(1));
}
}
/**多參數(shù)無返回*/
@FunctionalInterface
interface NoReturnMultiParam1 {
void method(int a, int b);
}
/**無參無返回值*/
@FunctionalInterface
interface NoReturnNoParam {
void method();
}
/**一個(gè)參數(shù)無返回*/
@FunctionalInterface
interface NoReturnOneParam {
void method(int a);
}
/**多個(gè)參數(shù)有返回值*/
@FunctionalInterface
interface ReturnMultiParam {
int method(int a, int b);
}
/*** 無參有返回*/
@FunctionalInterface
interface ReturnNoParam {
int method();
}
/**一個(gè)參數(shù)有返回值*/
@FunctionalInterface
interface ReturnOneParam {
int method(int a);
}
執(zhí)行結(jié)果如下:
四、lamda表達(dá)式的簡化:
簡化的方式:
//1.簡化參數(shù)類型,可以不寫參數(shù)類型,但是必須所有參數(shù)都不寫
NoReturnMultiParam1 lamdba1 = (a, b) -> {
System.out.println("簡化參數(shù)類型");
};
lamdba1.method(1, 2);
//2.簡化參數(shù)小括號,如果只有一個(gè)參數(shù)則可以省略參數(shù)小括號
NoReturnOneParam lambda2 = a -> {
System.out.println("簡化參數(shù)小括號");
};
lambda2.method(1);
//3.簡化方法體大括號,如果方法條只有一條語句,則可以勝率方法體大括號
NoReturnNoParam lambda3 = () -> System.out.println("簡化方法體大括號");
lambda3.method();
//4.如果方法體只有一條語句,并且是 return 語句,則可以省略方法體大括號
ReturnOneParam lambda4 = a -> a+3;
System.out.println(lambda4.method(5));
ReturnMultiParam lambda5 = (a, b) -> a+b;
System.out.println(lambda5.method(1, 1));
執(zhí)行結(jié)果如下:
總結(jié)
- 簡化參數(shù)類型,可以不寫參數(shù)類型,但是必須所有參數(shù)都不寫
- 簡化參數(shù)小括號,如果只有一個(gè)參數(shù)則可以省略參數(shù)小括號
- 簡化方法體大括號,如果方法條只有一條語句,則可以勝率方法體大括號
- 如果方法體只有一條語句,并且是 return 語句,則可以省略方法體大括號
寫作不易,請點(diǎn)贊、關(guān)注、評論給博主一個(gè)鼓勵(lì)吧~