简介:

笔者认为:超过3行的逻辑就不适用Lambda表达式了。虽然看着很先进,其实Lambda表达式的本质只是一个“语法糖”,由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。本人不建议乱用,因为这就和某些很高级的黑客写的代码一样简洁,难懂,难以调适,维护人员想骂娘。

Lambda表达式是Java SE8中一个很重要的新特性。Lambda表达式允许你通过表达式来代替功能接口Lambda表达式就和方法一样,他提供了一个正常的参数列表和一个使用这些参数的主体body,当然这个body可以是一个表达式或一个代码块

Lambda表达式还增强了集合库。Java SE8添加了2个对集合数据进行批量操作的包:java.util.function 包以及 java.util.stream 包。流(stream)就如同迭代器(iterator),但附加了许多额外的功能。 总的来说,Lambda表达式和 stream 是自Java语言添加泛型(Generics)注解(annotation)以来最大的变化。 在本文中,我们将从简单到复杂的示例中见认识Lambda表达式和stream的强悍。

Lambda表达式的语法

(parameters) -> expression

(parameters) ->{ statements; }

一:下面是Lambda表达式的简单例子

/*1. 不需要参数,返回值为5*/
() -> 5/*2. 接收一个参数(数字类型),返回其2倍的值*/
x -> 2 * x/*3. 接受2个参数(数字),并返回他们的差值*/
(x, y) -> x – y/*4. 接收2个int型整数,返回他们的和*/
(int x, int y) -> x + y/* 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)*/
(String s) -> System.out.print(s)

二:基本的Lambda例子

现在,我们已经知道什么是Lambda表达式,让我们先从一些基本的例子开始。 在本节中,我们将看到Lambda表达式如何影响我们编码的方式。 假设有一个玩家List ,程序员可以使用 for 语句 ("for 循环")来遍历,在Java SE 8中可以转换为另一种形式:

        public static void main(String[] args) {String[] atp = {"Rafael Nadal", "Novak Djokovic","Stanislas Wawrinka","David Ferrer","Roger Federer","Andy Murray","Tomas Berdych","Juan Martin Del Potro"};List<String> players = Arrays.asList(atp);/*以前for循环的方式*/for (String player : players) {System.out.println(player+";");}/*使用Lambda表达式以及函数操作*/players.forEach((player) -> System.out.println(player+";"));/*在Java 8中使用双冒号操作符*/players.forEach(System.out::println);}

正如你看到的,Lambda表达式可以将我们的代码缩减到一行。 另一个例子是在图形用户界面程序中,匿名类可以使用Lambda表达式来代替。 同样,在实现Runnable接口时也可以这样使用:

    /*使用匿名内部类*/btn.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent event) {System.out.println("Hello World!"); }});/*使用Lambda表达式*/btn.setOnAction(event->System.out.println("Hello World!"));

下面使用Lambda表达式来实现Runnable接口的实例:

                /*使用匿名内部类*/new Thread(new Runnable() {@Overridepublic void run() {System.out.println("1233");}}).start();/*使用Lambda表达式*/new Thread(()->System.out.println("1233")).start();/*使用匿名内部类*/Runnable runnable =new Runnable() {@Overridepublic void run() {System.out.println("1233");}};new Thread(runnable).start();/*使用Lambda表达式*/Runnable runnable2 =()->System.out.println("1233");new Thread(runnable2).start();

RunnableLambda表达式,使用块格式,将五行代码转换成单行语句。

使用Lambdas排序集合

在Java中,Comparator 类被用来排序集合。 在下面的例子中,我们将根据球员的 name, surname, name 长度 以及最后一个字母。 和前面的示例一样,先使用匿名内部类来排序,然后再使用Lambda表达式精简我们的代码。在第一个例子中,我们将根据name来排序list。 使用旧的方式,代码如下所示:

        public static void main(String[] args) {String[] players = {"Rafael Nadal", "Novak Djokovic","Stanislas Wawrinka","David Ferrer","Roger Federer","Andy Murray","Tomas Berdych","Juan Martin Del Potro"};/*使用匿名内部类*/Arrays.sort(players, new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {return s1.compareTo(s2);}});/*使用Lambda表达式1*/Arrays.sort(players,(String s1,String s2)->s1.compareTo(s2));/*使用Lambda表达式2*/Comparator<String> comparator =(s1,s2) ->s1.compareTo(s2);Arrays.sort(players,comparator);}

使用Lambdas和Streams

Stream是对集合的包装,通常和Lambda一起使用。 使用Lambda表达式可以支持许多操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等等。 同样,Stream使用懒运算,他们并不会真正地读取所有数据,遇到像getFirst() 这样的方法就会结束链式语法。 在接下来的例子中,我们将探索Lambdasstreams 能做什么。 关于Stream的用法,参考我的上一篇文章,地址在https://blog.csdn.net/xhf852963/article/details/103151306。

原文地址:https://blog.csdn.net/renfufei/article/details/24600507

浅析Lambda表达式相关推荐

  1. 浅析Lambda 表达式

    前几天的心情阴霾已经被那灿烂的阳光给消灭,在这里要谢谢那为朋友的指点.. 现在 偶也想说说Lambda 表达式.. 当C#2.0的匿名方法提出后,给开发人员直接处理委托带来了福音, 然而,匿名方法处理 ...

  2. 【Java 8 in Action】Lambda表达式

    文章目录 Lambda表达式 Lambda表达式的介绍 Lambda表达式的语法 Method References Default methods Functional Interface 浅析La ...

  3. lambda表达式浅析【C++学习笔记】

    lambda表达式浅析[C++学习笔记] 基本用法: auto f = [/*捕获列表*/](/*参数*/)->int /*后置返回值类型*/{/** 函数体*/}; 捕获列表: [] : 不捕 ...

  4. c#进阶之lambda表达式

    阅读之前,先确保对委托有基本的了解,传送门 c#进阶之浅析委托和事件. lambda表达式雏形第一步 在委托那篇文章,绑定的的方法都是具名函数,为了简化书写,可以换成匿名函数 public deleg ...

  5. Lambda 表达式基础理论与示例

    Lambda 表达式基础理论与示例 Lambda 表达式,也可称为闭包,推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lam ...

  6. lambda表达式树

    一.定义: 表达式树又称为表达式目录树,以数据形式表示语言级代码.所有的数据都存储在树结构中,每个结点表示一个表达式(Expression). 二.要点: –Lambda表达式的参数类型可以忽略,因为 ...

  7. java 8 lambda reduce_JDK8新特性Lambda表达式体验

    "Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstra ...

  8. java saf_Java 8 Lambda表达式探险

    为什么? 我们为什么需要Lambda表达式 主要有三个原因: > 更加紧凑的代码 比如Java中现有的匿名内部类以及监听器(listeners)和事件处理器(handlers)都显得很冗长 &g ...

  9. lamda表达式python_Python--13 lambda表达式

    python 允许使用lambda表达式来创建匿名函数 lambda表达式 >>>def ds(x): ... return 2 * x +1 ... >>> ds ...

最新文章

  1. CAD二次开发之入门坑
  2. iOS:图片相关(19-05-09更)
  3. 信奥中的数学:博弈论
  4. 超好用的自带火焰图的 Java 性能分析工具 Async-profiler 了解一下
  5. Python的序列Ⅰ
  6. python绑定句柄容易么_Python 有什么奇技淫巧?
  7. jQuery基础系列
  8. L1-031. 到底是不是太胖了-PAT团体程序设计天梯赛GPLT
  9. mysql每一行数据类型_MySQL_MySQL编程中的6个实用技巧,每一行命令都是用分号(;)作为 - phpStudy...
  10. Java switch-case语句用法
  11. 【OpenCV】计算两幅图片视觉差
  12. ebtables日志nflog
  13. 使用@ConfigurationProperties注解获取为null的问题
  14. Win11,cmd闪退的一种解决思路
  15. 前端请求报:NET::ERR_INCOMPLETE_CHUNKED_ENCODING,响应200,但接收不到正常响应
  16. C# winforms datagridview 设置右键菜单【完整版】
  17. 查询一个月的全部日期
  18. 第六章 面向对象编程基础总结
  19. Vue教程_tips
  20. 富贵不压重发_【一点资讯】头发面相歌诀:“贵人不顶重发,十个秃子九个富” www.yidianzixun.com...

热门文章

  1. 硬盘分区表丢失、修复大事记–分区表修复利器testdisk
  2. 浅析如何把逻辑地址转换为物理地址
  3. cookies的时限是多少_cookie有效期限30天什么意思
  4. sharepoint 命令行安装、部署、删除wsp包
  5. C语言专升本编程题复习
  6. 2017.12.29T19-B3-U3I/Ojiangyi
  7. android 仿微信聊天时间格式化显示
  8. [RK3288][Android6.0] DVP接口摄像头OV5640添加
  9. Moco接口框架的应用实战
  10. java pdfbox 解析报错_pdfBox 解析 pdf文件