本文从以下几方面简单描述Lambda的使用。
- 定义
- 语法
- 函数式接口
- 方法引用与构造器引用及其用例
- 用处
定义
一个代码块,可以在以后执行一次或者多次。本质上就是一个接口的实现。
语法
参数 箭头(->) 表达式
注意事项:
lambda表达式没有参数也需要提供空括号;无须指定lambda表达式的返回类型总是会由上下文推导得出。
函数式接口
只有一个抽象方法的接口,这种接口称为函数式接口(eg:java.lang.Runnable)
如果设计的接口只有一个抽象方法,可以用@Functionalinterface注解来标记这个接口。这样做可以避免增加另一个抽象方法。另外在Javadoc页里会指出你的接口是一个函数式接口。
方法引用与构造器引用及其用例
方法引用格式:
- object::instanceMethod
- Class::staticMethod
- Class::instanceMethod
构造器引用格式:
跟方法引用很类似不过使用的是new。
/**********************无参构造器*******************/
//指向Csgo()
Supplier<Csgo> supplier = Csgo::new;
//产生一个Csgo实例
Csgo csgo = supplier.get();
System.out.println(csgo.toString());
//这两个是等价的
Supplier<Csgo> supplier1 = ()-> new Csgo();
supplier1.get();
/*******************单个参数构造器*******************/
//指向Csgo(int goals)构造函数的引用
Function<Integer,Csgo> function = Csgo::new;
Csgo csgo1 = function.apply(16);
System.out.println(csgo1.toString());
//这两个是等价的
Function<Integer,Csgo> function1 = (weight) -> new Csgo(weight);
Csgo csgo2 = function1.apply(200);
/*******************两个参数构造器**********************/
BiFunction<String ,String, Csgo> biFunction = Csgo::new;
Csgo csgo3 = biFunction.apply("CT-Win", "T-Lose");
System.out.println(csgo3.toString());
/***********************多个参数**********************/
LambdaInterface lambdaInterface = Csgo::new;
Csgo csgo4 = lambdaInterface.createCsgo("CT-Win", "T-Lose", 15);
System.out.println(csgo4.toString());
BiFunction<Double, Double, Double> pow = Math::pow;
pow.apply(12.0,12.0);
Function<String, Integer> stringIntegerIntegerBiFunction = Integer::parseInt;
LambdaIntegerInterface lambdaIntegerInterface = csgo::setGoals;
public class Csgo {
private String ct;
private String t;
private int goals;
public Csgo() {
}
public Csgo(int goals) {
this.goals = goals;
}
public Csgo(String ct, String t) {
this.ct = ct;
this.t = t;
}
public Csgo(String ct, String t, int goals) {
this.ct = ct;
this.t = t;
this.goals = goals;
}
public String getCt() {
return ct;
}
public void setCt(String ct) {
this.ct = ct;
}
public String getT() {
return t;
}
public void setT(String t) {
this.t = t;
}
public int getGoals() {
return goals;
}
public int setGoals(int goals) {
this.goals = goals;
return goals;
}
@Override
public String toString() {
return "Csgo{" +
"ct='" + ct + '\'' +
", t='" + t + '\'' +
", goals=" + goals +
'}';
}
}
@FunctionalInterface
public interface LambdaInterface {
public Csgo createCsgo(String ct, String t, int goals);
}
@FunctionalInterface
public interface LambdaIntegerInterface {
public int createCsgo(int a);
}
相信大家看到上述代码应该能大致明白Lambda的简单使用了。
用处
Lambda表达式的重点是延迟执行。
· 在一个单独的线程中运行代码
· 多次运行代码
· 在算法适当的位置运行(比如:排序比较操作)
· 发生在某种情况时才会执行的代码(点击事件,定时任务)
这里简单说一下Lambda表达式访问外围方法和类中的变量
只能引用不会改变的变量,否则会报错。