lambda与方法引用

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 apples = Arrays.asList(new Apple().setColor("red").setWeight(100),
                new Apple().setColor("yellow").setWeight(180),
                new Apple().setColor("black").setWeight(140));
  1. 匿名类

    apples.sort(new Comparator() {
            public int compare(Apple a1, Apple a2){
                return a1.getWeight().compareTo(a2.getWeight());
            }
    });
    
  2. lambda表达式简化

    // 1.简化
    apples.sort((Apple a,Apple b)->b.getWeight().compareTo(a.getWeight()));
    // 2.使用Comparator接口的comparing方法
    apples.sort(Comparator.comparing((Apple a)->a.getWeight()));
    
  3. 使用方法引用

    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 predicate = (Apple a)->a.getWeight()>100;
Predicate predicate2 = (Apple a)->a.getColor().equals("yellow");
// 非
Predicate notRedApple = predicate.negate();
// 与
Predicate andPredicate = notRedApple.and(predicate2);

apples.stream().filter(notRedApple);
apples.stream().filter(andPredicate);

函数复合

Function f = x -> x + 1;
Function g = x -> x * 2;
Function h = f.andThen(g);
int result = h.apply(1); 
// 结果返回4

你可能感兴趣的:(lambda与方法引用)