美文网首页
lambda与方法引用

lambda与方法引用

作者: 请叫我铁臂阿童木 | 来源:发表于2019-06-20 14:47 被阅读0次

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));
  1. 匿名类

    apples.sort(new Comparator<Apple>() {
            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<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

相关文章

  • 方法引用 & 构造器引用

    一、方法引用   使用方法引用代替Lambda表达式,Lambda体中调用方法的参数列表与返回值类型,与函数式接口...

  • JDK1.8新增特性参考

    Lambda表达式 Stream函数式操作流元素集合 接口新增:默认方法与静态方法 方法引用,与Lambda表达式...

  • Java自学-Lambda 方法引用

    Lambda 方法引用 步骤 1 : 引用静态方法 首先为TestLambda添加一个静态方法: Lambda表达...

  • lambda与方法引用

    Lambda表达式:简洁地表示可传递的匿名函数的一种方式。lambda用于何处:在函数式接口上使用Lambda表达...

  • 方法引用

    方法引用:若lambda体中的内容有方法已经实现了,我们可以使用”方法引用“(可以理解为方法引用是lambda表达...

  • 第四十三条:方法引用优先于Lambda

    与匿名类相比,Lambda的主要优势在于更加简洁。Java提供了生成比Lambda更加简洁函数对象的方法:方法引用...

  • JAVA新特性总结

    Lambda 表达式− Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。 方法引用− 方法引用...

  • Java8

    lambda表达式与方法引用 lambda表达式 一般形式: (a,b)->a+b; (a,b)->{ st...

  • JAVA 8 新特性

    1.JAVA 8 新特性 Lambda表达式:Lambda允许把函数作为一个方法的参数; 方法引用:方法引用提供了...

  • 2020-07-18方法引用

    方法引用符 ::该符号为引用运算符,而它所在的表达式被称为方法引用 推到与省略原则①如果使用Lambda。那么根据...

网友评论

      本文标题:lambda与方法引用

      本文链接:https://www.haomeiwen.com/subject/mgzdqctx.html