Lambda表达式简介

1.Lambda表达式和匿名函数很相似其实:没有名称,但是有参数列表,函数主体,返回类型,可能还有一个抛出的异常列表。
最主要的作用个人觉得能够大量的简化代码
只能在接受函数接口的地方才可以使用Lambda表达式
eg.
Comparator<Animal> byAge = new Comparator<Anima>(){
public int compare(Animal a1,Animal a2){
return a1.getAge().compareTo(a2.getAge());
}
}
但是用了Lambda之后
Comparator<Animal> byAge =(Animal a1,Animal a2) ->a1.getAge().compareTo(a2.getAge());
代码确实简单了不少。
2.再说Lambda表达式在哪里可以用:在函数式接口上使用。
1)函数式接口:就是之定义一个抽象方法的接口
2)而lambda其实说白了就是一个函数式接口的具体实例
3.一般我们想使用Lambda表达式的时候需要进行创建接口等,但是有的时候我们不想要去自己手动创建,也可以,java为我们提供了几个现成的
1)java.util.function.Predicate<T> 接口定义了一个test的抽象对象,接受对象是泛型T,但是返回的是boolean类型,直接使用就行。
eg.
Predicate<String> a =(String s) -> !s.isEmpty();
2)java.util.function.Consumer<T>接口定义了一个accept的抽象方法,接受泛型参数,没有返回(void)。
eg.(Integer i) ->System.out.println(i);
3)java.util.function.Function<T,R>接口定义了一个叫做apply的方法,接受一个泛型T的对象,返回一个泛型R。(例如你可以输入一个颜色,返回一个长度)
4)一般来说,针对专门的输入类型的函数式接口名称都要加上原始类型的前缀
,egDoublePredicate,IntCousumer。IntFunction等。输入参数类型的表中:ToIntFuntion<T>,DoubleToIntFuntion<T>等。
当然了,他提供的并不仅仅是这三个接口,还有其他的,比如Supplier<T>,UnaryOperator<T>,BinaryOperator<T>等等。如果停工额度都不能满足,可以自己来进行定义。
4.一般来说函数式接口是不允许抛出异常的,如果想抛出异常,可以自己定义一个接口或者在Lambda表达式中用一个try catch包起来
5.一般来说,同一个Lambda可以适用于多个不同的函数式接口,但是方法签名需要兼容。
6.Lambda表达式还能够根据上下文自己获得目标类型
7.Lambda也可以调用局部变量,局部变量也可以不用final修饰,但是如果调用之后,就不能再修改这个变量的值,否则会报错。
eg.
int a =0;
Runnable r =()->System.out.print(a);
a=1;这样就会发生报错。
8.使用目标引用在前,方法名称在后的方式,中间用::相连,代表引用该类的方法。
eg.Animal::getAge()代表引用Animal类中的getAge()方法
9.构造函数的引用ClassName::new的方式
eg.Supplier<Animal> a1 =Animal::new;(这种是没有参数的构造方法)
Animal a2 =a1.get();
Function<Integer,Animal> a3 =Animal::new;(这种是Integer参数的构造方法)
Animal a4 =a3.apply(110);
10.举一个排序的例子:inventory.sort(comparing(Animal::getAge()));
确实是简化了很多代码
11.Lambda表达式的比较器组合
1)逆序
inventory.sort(comparing(Animal::getAge()).reversed());
2)二次比较
inventory.sort(comparing(Animal::getAge()).reversed().thencomparing((Animal::getWeight()));
12.还有三个谓词接口方法:negate,and,or
Predicate<Animal> noDog = Dog.negate()返回一个现有对象的非
Predicate<Animal> noDog = Dog.and(a->a.getAge()>15)返回是狗并且大于15岁的
Predicate<Animal> noDog = Dog.and(a->a.getAge()>15).or(a->"pig".equals(a.getKind()))
返回大于十五岁的是狗否则是猪
13函数复合,将两个函数组合在一起,使用andThen方法
eg.a.andThen(b)表示a(b(x))
但是a.compose(b)表示b(a(x))
注:本篇文章是我在读完java8实战之后的相关总结
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值