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<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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • 简介 概念 Lambda 表达式可以理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主...
    刘涤生阅读 3,202评论 5 18
  • 第一章 为什么要关心Java 8 使用Stream库来选择最佳低级执行机制可以避免使用Synchronized(同...
    谢随安阅读 1,491评论 0 4
  • 本文内容大部分来自《Java 8实战》一书 前言 在上一篇文章中,我们了解了利用行为参数化来传递代码有助于应对不断...
    我没有三颗心脏阅读 5,070评论 0 3
  • Lambda表达式 利用行为参数化这个概念,就可以编写更为灵活且可重复使用的代码。但同时,使用匿名类来表示不同的行...
    谢随安阅读 871评论 2 0
  • 参考文章地址 前言 在上一篇文章中,我们了解了利用行为参数化来传递代码有助于应对不断变化的需求,它允许你定义一个代...
    流年划破容颜_cc55阅读 258评论 0 0