文章目录
- Lambda表达式
- 函数式编程思想
- Lambda表达式写法
- 代码讲解
Lambda表达式
函数式编程思想
强调做什么,而不是以什么形式做。
以函数式接口Runnable为例讲解:
public class LambdaDemo {public static void main(String[] args) {Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("Hello World");}};new Thread(runnable).start();}
}
- Thread 类需要 Runnable 接口作为参数,其中的抽象 run 方法是用来指定线程任务内容的核心;
- 为了指定 run 的方法体,不得不需要 Runnable 接口的实现类;
- 为了省去定义一个 RunnableImpl 实现类的麻烦,不得不使用匿名内部类;
- 必须覆盖重写抽象 run 方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错;
- 而实际上,似乎只有方法体才是关键所在。
Lambda表达式写法
标准格式:
(参数类型 参数名称) ‐> { 代码语句 }
- 小括号内的语法与传统方法参数列表一致:无参数则留空;多个参数则用逗号分隔。
- -> 是新引入的语法格式,代表指向动作。
- 大括号内的语法与传统方法体要求基本一致。
public class LambdaDemo {public static void main(String[] args) {Runnable runnable = () -> System.out.println("Hello World");new Thread(runnable).start();}
}
- 前面的一对小括号即 run 方法的参数(无),代表不需要任何条件;
- 中间的一个箭头代表将前面的参数传递给后面的代码;
- 后面的输出语句即业务逻辑代码。
这里可以看到我们使用lambda表达式的写法,使我们的代码更加简单,注重了结果的显示,避免了冗余代码。
代码讲解
- 无参无返回值
Plane.java
@FunctionalInterface
public interface Plane {void fly();
}
Customer.java
public class Customer {public static void invokePlane(Plane plane){plane.fly();}public static void main(String[] args) {Customer.invokePlane(() -> System.out.println("飞机起飞咯!"));}
}
- 有参无返回值
Plane.java
@FunctionalInterface
public interface Plane {void fly(String name);
}
Customer.java
public class Customer {public static void invokePlane(String name , Plane plane){plane.fly(name);}public static void main(String[] args) {Customer.invokePlane("飞机一号",name -> System.out.println(name + ",起飞咯!"));}
}
- 无参有返回值
Plane.java
@FunctionalInterface
public interface Plane {String fly();
}
Customer.java
public class Customer {public static void invokePlane(Plane plane){System.out.println(plane.fly());}public static void main(String[] args) {Customer.invokePlane(() -> "飞机起飞咯!");}
}
- 有参有返回值
Plane.java
@FunctionalInterface
public interface Plane {String fly(Date date,String name);
}
Customer.java
import java.util.Date;public class Customer {public static void invokePlane(Date date, String name, Plane plane) {System.out.println(plane.fly(date, name));}public static void main(String[] args) {Customer.invokePlane(new Date(),"飞机一号",(date, name) -> name + "在" + date.toLocaleString() + "时起飞咯!");}
}
小tips:
可推导即可省略
- 小括号内参数的类型可以省略;
- 如果小括号内有且仅有一个参,则小括号可以省略;
- 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。
以上代码中的lambda表达式全是最简写法,感兴趣的友友可以尝试该成完整版本。
这里以最后一个例子为例讲解一下完整版本。
import java.util.Date;public class Customer {public static void invokePlane(Date date, String name, Plane plane) {System.out.println(plane.fly(date, name));}public static void main(String[] args) {Customer.invokePlane(new Date(),"飞机一号",(date, name) -> { return name + "在" + date.toLocaleString() + "时起飞咯!";});}
}
欢迎java热爱者了解文章,作者将会持续更新中,期待各位友友的关注和收藏。。。