1、什么是Lambda表达式?
Lambda是一个匿名函数,可以理解为是一段可以传递的代码,可以将代码像传递参数、传递数据一样进行传输。使用Lambda表达式,可以写出更加紧凑、更加简洁、更加灵活的代码。
2、使用Lambda的限制条件
Lambda并不是任何地方都可以使用,Lambda表达式需要“函数式接口”的支持。
3、什么是函数式接口?
接口中只有一个抽象方法的接口,称为函数式接口,可以用@FunctionalInterface修饰一下,这里需要注意的是:未使用 @FunctionalInterfaces注解的接口未必就不是函数式接口,一个接口是不是函数式接口的条件只有一条,即接口中只有一个抽象方法的接口(Object类中的方法不算)。而使用@FunctionalInterface注解修饰了的接口就一定是函数式接口,添加@FunctionalInterface注解可以帮助我们检查是否是函数式接口。
JDK中常见的函数式接口有:
@FunctionalInterface
public interface Runnable {
void run();
}
@FunctionalInterface
public interface Callable<V> {
V call() throws Exception;
}
以下接口中有一个方法,但因hashCode()是Object类中的方法,因此该接口不是函数式接口:
@FunctionalInterface
public interface FuncInterface {
int hashCode(); // Object类中的方法
}
4、Lambda表达式示例
未使用Lambda表达式时的写法:
public class LambdaTest {
@Test
public void print() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello World");
}
});
thread.start();
}}
使用Lambda时的写法:
public class LambdaTest {
public void print() {
Thread thread = new Thread(() -> System.out.println("Hello World"));
}
}
5、Lambda表达式的语法
5.1 Lambda表达式的语法结构
(参数列表) -> {对抽象方法的实现}
Lambda表达式语法分在3个部分:
1 左边的参数列表,对应的是函数式接口中抽象方法的参数列表;
2 中间的符号:->,为固定写法;
3 右边大括号内对函数接口抽象方法的实现。
Lambda表达式的在具体场景下可以有简略写法。
5.2 语法格式一:无参数,无返回值
Runnable runnable = () -> {System.out.println("Hello World");}
Runnable runnable = () -> System.out.println("Hello World"); // 简写形式
此时,如果右边的代码简单,只有一行代码时,{}可以省略。
5.2 语法格式二:有一个参数,无返回值
public class CalculatorTest {
public void print(Consumer<String> msg) {
System.out.println(msg);
}
public void doPrint(String msg) {
print((str) -> System.out.println(msg));
print(str -> System.out.println(msg)); // 简写
}
}
此时,左边的()可以省略。
5.3 语法格式三:Lambda体内只有一条语句,且有返回值,return可省略
public Integer subtr(Integer v1,Integer v2) {
return operator(v1,v2,(x,y) -> x - y);
}
5.4 语法格式四:有两个以上参数,且Lambda体中有多条语句
public Integer add(Integer v1,Integer v2) {
return operator(v1,v2,(x,y) -> {
System.out.println("进行加法运算");
return x + y;
});
}
5.5 语法格式五:Lambda表达式的数据类型可以省略不写
JVM编译器通过上下文可以推断出数据类型,但要注意的是,当多个参数时,要么都写,要么都不写,不能有的写,有的不写:
public Integer subtr(Integer v1,Integer v2) {
return operator(v1,v2,(Integer x,y) -> x - y); // 错误
}
public Integer subtr(Integer v1,Integer v2) {
return operator(v1,v2,(x,y) -> x - y); // 正确
}
6、Java8四大内置核心函数式接口
Consumer<T> : 消费型接口(无返回值,有去无回)
void accept(T t);
Supplier<T> : 供给型接口
T get();
Function<T,R> : 函数型接口
R apply(T t);
Predicate<T> : 断言型接口
boolean test(T t);
四大核心接口的-->扩展子接口
lombok
lombok是一款可以精减java代码、提升开发人员生产效率的辅助工具,利用注解在编译期自动生成setter/getter/toString()/constructor之类的代码。代码越少,意味着出bug的可能性越低。
常用注解
- @Data 注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
- @Setter :注解在属性上;为属性提供 setting 方法
- @Setter :注解在属性上;为属性提供 getting 方法
- @Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
- @NoArgsConstructor :注解在类上;为类提供一个无参的构造方法
- @AllArgsConstructor :注解在类上;为类提供一个全参的构造方法
- @Cleanup : 可以关闭流
- @Builder : 被注解的类加个构造者模式
- @Synchronized : 加个同步锁
- @SneakyThrows : 等同于try/catch 捕获异常
- @NonNull : 如果给参数加个这个注解 参数为null会抛出空指针异常
- @Value : 注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。
lombok 引用文章:https://www.cnblogs.com/softidea/p/5960182.html
lombok 引用文章:https://blog.csdn.net/u011308294/article/details/78627560
lomda 引用文章:https://www.cnblogs.com/wuhenzhidu/p/lambda.html