lambda表达式的学习
1、lambda表达式是什么?
lambda表达式是一种函数式的编程方式,用来使代码更加简洁明了,而在java中的lambda表达式时实质上就是直接实现接口中的方法,大大简化调用某个接口中方法的操作。
2、什么时候使用lambda表达式?
根据java核心技术卷二里面所写,只有某个接口里面只有一个抽象方法的时候可以使用lambda表达式进行替换,核心在于接口,以及具有唯一的抽象方法,之所以要强调抽象方法,是因为java8中的新特性引入了接口中可以实现默认方法,而接口中如果有多个默认方法与一个抽象方法时,也是可以使用lambda表达式的。在stream类的源码中就有这样的实例如下:
public interface Predicate<T> {
boolean test(T t);
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
default Predicate<T> negate() {
return (t) -> !test(t);
}
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}
这是stream.filter中的断言源码,我们很多时候都使用lambda表达式来直接实现里面的test方法
3、如何使用lambda
1.无参的(也就是指接口中的方法没有参数)
package com.ahei.speciality2;
public interface Eatable {
void eat();
}
-----------------实现如下
package com.ahei.speciality2;
public class EatableDemo {
public static void main(String[] args) {
Eatable e=new EatableImpl();
useEatable(e);
//使用匿名内部类
useEatable(new Eatable() {
@Override
public void eat() {
System.out.println("一天");
}
});
//使用lambda表达式
useEatable(()->{
System.out.println("一天两个苹果");
});
}
private static void useEatable(Eatable e){
e.eat();
}
}
2、有参数的(也就是指接口中的方法需要参数)
接口代码如下:
int add(int x,int y);
}
具体测试:
package com.ahei.speciality4;
public class AddableDemo {
public static void main(String[] args) {
AddableImpl addable = new AddableImpl();
useAddable(addable);
//匿名内部类
useAddable(new Addable() {
@Override
public int add(int x, int y) {
return x+y;
}
});
//lambda表达式
useAddable((int a,int b)->{
return a+b;
});
}
private static void useAddable(Addable a){
int sum=a.add(10,20);
System.out.println(sum);
}
}
4、lambda表达式的省略规则
- 1.(圆括号里面为参数),有多个参数时需要用,隔开,可以不需要定义参数类型,但是有多个参数得
- 时候,不能只省略一个参数类型
- jvm会自动识别参数的类型,圆括号里面的值为空的时候,表示是一个空参数
- 2.方法体只有一个表达式的时候可以不用{}和分号; ,同时系统会自动返回表达式的值,有多个表达式的时候
- 需要用写在{里面},同时指定返回的值
- 3.当参数只有一个得时候,可以省略(),
- 4.如果有return的时候,省略{}和;的时候也要把return省略掉
5、lambda表达式与匿名内部类的区别
区别1:匿名内部类可以用来实现类,抽象类,接口,而lambda表达式只能简化具有一个抽象方法的接口,两者的使用范围不同
区别2:编译后,匿名内部类会生成一个带有$符号的class文件,而lambda表达式不会生成其他文件
欢迎指正!!!!!!