Lambda表达式:简洁地表示可传递的匿名函数的一种方式。
lambda用于何处:在函数式接口上使用Lambda表达式 。
函数式接口:只定义了一个抽象方法的接口为函数式接口(哪怕有很多默认方法)。
函数式编程:让方法作为值。
lambda
labmda格式
(Apple a,Apple b)->b.getWeight().compareTo(a.getWeight())
//箭头前面括号内的为labmda参数
//箭头后面的为labmda主体
下列仅有 4、5不是lambda表达式
(1) () -> {}
// 这个Lambda没有参数,并返回void。它类似于主体为空的方法:public void run() {}
(2) () -> "Raoul"
// 这个Lambda没有参数,并返回String作为表达式。
(3) () -> {return "Mario";}
// 这个Lambda没有参数,并返回String(利用显式返回语句)。
(4) (Integer i) -> return "Alan" + i;
// return是一个控制流语句。要使此Lambda有效,需要使花括号,如下所示: (Integer i) -> {return "Alan" + i;}。
(5) (String s) -> {"IronMan";}
// “Iron Man”是一个表达式,不是一个语句。要使此Lambda有效,你可以去除花括号 和分号,如下所示:(String s) -> "Iron Man"。或者如果你喜欢,可以使用显式返回语 句,如下所示:(String s)->{return "IronMan";}。
方法引用规则
常见方法引用有如下三种:
lambda写法 | 方法引用方式 | 备注 |
---|---|---|
(args) -> ClassName.staticMethod(args) | ClassName::staticMethod | 其中staticMethod为静态方法 |
(arg0, rest) -> arg0.instanceMethod(rest) | ClassName::instanceMethod | 其中ClassName是arg0的类型 |
(args) -> expr.instanceMethod(args) | expr::instanceMethod | expr是实例化后的对象 |
Lambda与方法引用实践
针对下面的Apple集合,现有需求根据重量排序。实现推导Lambda与方法引用。
List<Apple> apples = Arrays.asList(new Apple().setColor("red").setWeight(100),
new Apple().setColor("yellow").setWeight(180),
new Apple().setColor("black").setWeight(140));
-
匿名类
apples.sort(new Comparator<Apple>() { public int compare(Apple a1, Apple a2){ return a1.getWeight().compareTo(a2.getWeight()); } });
-
lambda表达式简化
// 1.简化 apples.sort((Apple a,Apple b)->b.getWeight().compareTo(a.getWeight())); // 2.使用Comparator接口的comparing方法 apples.sort(Comparator.comparing((Apple a)->a.getWeight()));
-
使用方法引用
apples.sort(Comparator.comparing(Apple::getWeight));
复合lambda表达式
比较器复合
// 原有基础上逆序
apples.sort(Comparator.comparing(Apple::getWeight).reversed());
// 原有基础上逆序,一样重时 再按颜色排序
apples.sort(Comparator.comparing(Apple::getWeight).reversed()
.thenComparing(Apple::getColor));
谓词复合
Predicate<Apple> predicate = (Apple a)->a.getWeight()>100;
Predicate<Apple> predicate2 = (Apple a)->a.getColor().equals("yellow");
// 非
Predicate<Apple> notRedApple = predicate.negate();
// 与
Predicate<Apple> andPredicate = notRedApple.and(predicate2);
apples.stream().filter(notRedApple);
apples.stream().filter(andPredicate);
函数复合
Function<Integer, Integer> f = x -> x + 1;
Function<Integer, Integer> g = x -> x * 2;
Function<Integer, Integer> h = f.andThen(g);
int result = h.apply(1);
// 结果返回4
网友评论