小编发现在leetcode(力扣)上,许多大佬的解题方法中有大量使用lamdaa表达式,让小编向往,但代码阅读对小编这样的小白不太友好,所以小编决定学习lamdba表达式,让自己更加了解和使用lamdba,小编也是小白,非常推荐与小白一起学习。
目录
结论:()->代替内部类中的方法,{ 方法体 } 来书写方法体。
Lamdba表达式
JDK8.0后新功能,Lamdba是一个匿名函数。
作用:替代一些特殊的匿名内部类,让编程更加简洁(特殊的匿名内部类:匿名内部类实现的接口中只有一个抽象的类方法的内部类)
lamdba运算符:->
lamdba表达式语法:(有参数加参数)-> {表达式;} (当表达式只有一个时可以省略{})
public interface LamdbaTest {
public void method();
}
class MyClass implements LamdbaTest{
public void method(){
System.out.println("______method()______");
}
public static void main(String[] args) {
//1,定义实现类,创建对象并使用
LamdbaTest lamdbaTest = new MyClass();
lamdbaTest.method();
//2,匿名内部类
LamdbaTest lamdbaTest1 = new MyClass(){
@Override
public void method() {
System.out.println("这是个匿名内部类!");
}
};
lamdbaTest1.method();
//lamdba表达式
// LamdbaTest lamdbaTest2 = ()->{ System.out.println("这是lamdba表达式!");};
//当只有一条语句时,让lamdba更加简洁
LamdbaTest lamdbaTest2 = ()-> System.out.println("这是lamdba表达式!");
lamdbaTest2.method();
}
}
结论:()->代替内部类中的方法,{ 方法体 } 来书写方法体。
lamdba表达式的使用
无参无返回值
public interface LamdbaTest {
// 无参无返回值
public void method();
}
class MyClass implements LamdbaTest{
public void method(){
System.out.println("______method()______");
}
public static void main(String[] args) {
//lamdba表达式
// LamdbaTest lamdbaTest2 = ()->{ System.out.println("这是无参无返回的lamdba表达式!");};
//当只有一条语句时,让lamdba更加简洁
LamdbaTest lamdbaTest2 = ()-> System.out.println("这是无参无返回的lamdba表达式!");
lamdbaTest2.method();
//当多条条语句时,无参无返回
LamdbaTest lamdbaTest = ()-> {System.out.println("这是多条无参无返回的lamdba表达式!");
System.out.println("不要忘记添加{}与;号哦");};
lamdbaTest.method();
}
}
结论:
1,当表达式只有一个是{}可以省略,多条表达式时{}不能省略,还要添加;。
2,lamdba表达式只能引用标记了final的外层局部变量,lamdba表达式的局部变量不要声明final,但变量不能被后面代码修改。
观察下面代码分析有什么问题?
package com.luo_sf.map;
public interface LamdbaTest {
// 无参无返回值
public void method();
}
class MyClass implements LamdbaTest{
public void method(){
System.out.println("______method()______");
}
public static void main(String[] args) {
int sum = 5;//隐藏了final
//当多条条语句时,无参无返回
LamdbaTest lamdbaTest = ()-> {System.out.println("这是多条无参无返回的lamdba表达式!");
System.out.println("不要忘记添加{}与;号哦");
//sum++;
System.out.println(sum);};//可以访问sum
lamdbaTest.method();
}
}
在lamdba表达式中可以访问所在局部变量,但不能进行修改,因为在lamdba表达式下变量是用隐藏final修饰的。
一个参数无返回值
public interface LamdbaTest {
// 一个参数参无返回值
public void method(int sum);
}
class MyClass implements LamdbaTest{
public void method(int sum){
System.out.println("______method()______");
}
public static void main(String[] args) {
//当一条语句时,一个参数无返回
LamdbaTest lamdbaTest = (int num)->{
System.out.println(num+100);
};
lamdbaTest.method(100);
//当多条语句时,一个参数无返回
LamdbaTest lamdbaTest1 = (n)-> {System.out.println("这是多条一个参无返回的lamdba表达式!");
System.out.println("不要忘记添加{}与;号哦");
//sum++;
System.out.println(n+50);};
lamdbaTest1.method(100);
//方法二 :当多条语句时,一个参数时()可以省略
LamdbaTest lamdbaTest2 = n-> {System.out.println("这是多条一个参无返回的lamdba表达式!");
System.out.println("不要忘记添加{}与;号哦");
//sum++;
System.out.println(n+50);};
lamdbaTest1.method(100);
}
}
结论:
1,如果方法体只有一条语句,可以省略{},多条表达式时{}不能省略,还要添加;。
2,参数类可以省略,参数名称任意。
3,当参数为一个时,参数外()可以省略。
多个参数无返回值
public interface LamdbaTest {
// 多参数参无返回值
public void method(int sum , String name);
}
class MyClass implements LamdbaTest{
public void method(int sum , String name){
System.out.println("______method()______");
}
public static void main(String[] args) {
//当一条语句时,多个参数无返回
LamdbaTest lamdbaTest = (int num ,String name)->{
System.out.println(num+100+" 我是: "+name);
};
lamdbaTest.method(100,"法外狂徒");
//当多条语句时,多个参数无返回
LamdbaTest lamdbaTest1 = (n,name)-> {System.out.println("这是多条一个参无返回的lamdba表达式!");
System.out.println("不要忘记添加{}与;号哦");
//sum++;
System.out.println(n+50);
System.out.println(name);};
lamdbaTest1.method(100 , "张三");
}
}
结论:
1,如果方法体只有一条语句,可以省略{},多条表达式时{}不能省略,还要添加;。
2,参数类可以省略,参数名称任意(要省略一起省略!)。
3,当参数为多个时,参数外()不可以省略。
有参有返回值
public interface LamdbaTest {
// 有参有返回值
public int method(int sum);
}
class MyClass implements LamdbaTest{
public int method( int sum){
return 1;
}
public static void main(String[] args) {
//lamdba表达式
//当只有一条语句时,让lamdba更加简洁
LamdbaTest lamdbaTest = (n) -> {return n+100;};
//返回值需要输出打印
System.out.println(lamdbaTest.method(100));
//当只有一条语句时,return可以省略
LamdbaTest lamdbaTest1 = n -> n+100;
//返回值需要输出打印
System.out.println(lamdbaTest1.method(100));
//当多条条语句时,有参有返回
LamdbaTest lamdbaTest2 = (n)-> {System.out.println("这是多条有参有返回的lamdba表达式!");
System.out.println("不要忘记添加{}与;号哦");
return n+100;};
System.out.println( lamdbaTest2.method(100));
}
}
结论:
1,如果方法体只有一条语句,可以省略{},还可以省略return,
2, 多条表达式时{}不能省略,还要添加;。
3,参数类可以省略,参数名称任意(要省略一起省略!)。
4,当参数为多个时,参数外()不可以省略。
觉得还不错,记得关注小编哦,欢迎评论,点赞 收藏哦!