廉颇老矣,尚能饭否

Java,这位已经20多岁的编程语言,称得上是编程语言界的老大哥了。他曾经攻城略地,碾压各路编程语言小弟,风光无限,不可一世。现在,也是家大业大,江湖地位,很难撼动。
但是,这依然无法阻挡人们对其未来发展趋势的怀疑。这么多年过去了,江湖上新出来的各路小弟,悉数拿出自己的看家本领,确实让老大哥有些坐不住了,业界都在担心“廉颇老矣,尚能饭否”。
可以肯定的一点是,如果Java仅靠吃老本来维持自己的江湖地位是非常危险的。但是,他没有这么做!今天要说的Lambda就是一个铁证。

早在2014年,Oracle就发布了Java8,带来了让人振奋的不少新特性:

  • Lambda表达式
  • 接口的默认方法与静态方法
  • 方法引用
  • 重复注解
  • 扩展注解的支持
  • Optional
  • Stream
  • Date/Time API
  • JavaScript引擎Nashorn
  • Base64

周边Java的程序员很多,Java8的不多,为什么

但是从我周边来看,大家都多多少少听说过其中的一些新特性,但是切切实实把这些特性和API用起来的不多。当然,这其中原因很多。
有些因为历史原因,很难在架构上动手脚,从Java6换到Java8只是一句话的事,但是要实行起来,可能会带来让人夜不能眠的各种雷,所以很多人在老实的框架下待着,用着上古的Java6。
有些灵活性比较强的项目,通过一次大升级,转到了Java8阵营,但是各位码农觉得Java6或者Java7都完全够用,即便不够用或者不好用,想想又要花时间研究这些新特性,还是就这么将就着写吧。
有些业界从业者,早已经用上这些新特性了,只是他们不在Java阵营。比如14年,我身边就有人开始用Scala在Spark下完成大数据计算的业务和数据处理了,时常能听到他们说,Scala真的是太好用了。同时,伴随着大前端的火热,驻扎在JS阵营的也是不在少数,JS灵活的语法也是让人欲罢不能。这些语言早早的具备了Java8中的面向函数编程的思想。

Lambda

public class ThreadWithoutLambda {public static void main(String[] args) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("This is runable thread");}});thread.start();}
}

这样的程序,是不是再熟悉不过了。仔细瞧瞧这段代表要表达的意思其实就是启动一个线程,这个线程只做了一件事——打印“This is runnable thread”。有没有那么一瞬间看这个run方法有点不顺眼,如果有请看下面的写法

public class ThreadWithLambda {public static void main(String[] args) {Thread lambdaThread = new Thread(() -> System.out.println("This is lambda runnable thread"));lambdaThread.start();}
}

如何你用的是Java8的jdk,那么运行这两个类会发现,效果完全一样,而这,就是你听过很久的Lambda表达式的写法。如果你觉得有点意思,继续往下看。

我们把上面Lambda写法的语句拿出来

new Thread(() -> System.out.println("This is lambda runnable thread"))

在new Thread的构造方法里,我们看到传递的值不是我们经常看到的一个变量或者一个对象。凭着感觉和对于Thread的了解,这应该是一个函数,在Java8之前,我们能想到这种传递方式应该就是匿名内部类了,从某种程度上来说,Lambda就充当了匿名内部类这样的角色,但是实现起来,比其更加简洁易读。

除了Runnable接口的run方法,我们还有再熟悉不过的用于集合元素比较器的Comparator类,Java8之前,我们想对于一个集合采用自定义的方式排序,可以这样实现

public class ComparatorWithoutLambda {public static void main(String[] args) {List<Apple> apples = Arrays.asList(new Apple(100, "green"),new Apple(150, "red"),new Apple(120, "yellow"));System.out.println(apples);Collections.sort(apples, new Comparator<Apple>() {@Overridepublic int compare(Apple o1, Apple o2) {return o1.getWeight().compareTo(o2.getWeight());}});System.out.println(apples);}
}

这里通过比较集合中的元素apple的weight属性,按照weight的从小到大完成自定义排序。程序执行的结果如下

[Apple{weight=100, color='green'}, Apple{weight=150, color='red'}, Apple{weight=120, color='yellow'}]
[Apple{weight=100, color='green'}, Apple{weight=120, color='yellow'}, Apple{weight=150, color='red'}]

附上Apple类的实现

public class Apple {private Integer weight;private String color;public Apple() {}public Apple(int weight, String color) {this.weight = weight;this.color = color;}public Integer getWeight() {return weight;}public void setWeight(Integer weight) {this.weight = weight;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}@Overridepublic String toString() {return "Apple{" +"weight=" + weight +", color='" + color + '\'' +'}';}
}

使用Lambda的方式实现,同样很简洁,很惊艳

public class ComparatorWithLambda {public static void main(String[] args) {List<Apple> apples = Arrays.asList(new Apple(100, "green"),new Apple(150, "red"),new Apple(120, "yellow"));System.out.println(apples);Collections.sort(apples, (Apple apple1, Apple apple2) -> apple1.getWeight().compareTo(apple2.getWeight()));System.out.println(apples);}
}

Lambda语法

下面通过上面的例子看看Lambda的构成

Lambda表达式可以理解为可传递匿名函数的一种方式。没有名称,有参数、函数体和返回类型。

  • 匿名——他确实没有像普通函数那样有自己的名字,先前的匿名函数也是如此
  • 参数——上面的a1和a2就是参数,可以对应到没用Lambda时函数参数的声明
  • 函数体——就是上面的“apple1.getWeight().compareTo(apple2.getWeight())”,相当于没有Lambda中的compare函数的函数体
  • 返回类型——从函数体,我们可以推断(专业来说叫做类型推断)函数体返回的是一个boolean类型。
  • 箭头——将参数与函数体隔开

Lambda的语法主要有两种形式
(parameters) -> expression
(paramters) -> {statemenst;}
可要仔细看好这两种表达式语法,像(String s) -> return "hello world," + s;这种可不能成为Lambda表达式。

Lambda写法的应用举例

(List list) -> list.isEmpty(); ​布尔表达式
() -> new Apple(10); 创建一个对象
(Apple a) -> {System.out.println("a.getColor");} 消费一个对象
(Stirng s) -> s.length(); 从对象中选择、抽取
(int a, int b) -> a+b; ​ 组合两个值

今天先到这吧~~~
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!如果您想持续关注我的文章,请扫描二维码,关注JackieZheng的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。

转载于:https://www.cnblogs.com/bigdataZJ/p/Java8Tour1.html

Java8-初识Lambda相关推荐

  1. Java8中Lambda表达式的10个例子

    Java8中Lambda表达式的10个例子  例1 用Lambda表达式实现Runnable接口 Java代码   //Before Java 8: new Thread(new Runnable() ...

  2. java lambda if_使用Java8的Lambda实现Monda -解道Jdon

    使用Java8的Lambda实现Monad Monad是函数语言(Cojure或Scala)中的设计模式概念, 那么现在为什么在Java中变得如此重要?因为Java从版本8以后引入了新的Lambda特 ...

  3. 比较全的 Java8 9 lambda 应用

    Java8 9 lambda 学习笔记 /*** 引用类型的赋值是将原来的地址给了另一个引用,它们指向的地址是同一个,如果修改了其中一个,那么就会影响另一个.* 如果我们需要切断两者的联系,可以采用 ...

  4. java8的lambda中的map相关操作

    0 入门详解篇 1   史上最简单入门:java8的lambda中的map相关操作:基础及注意事项图文详解 2   java8的lambda中collect接口案例及原理详解,官方文档解读 3   j ...

  5. java8:封装lambda泛型工具类之list转为map

    1   史上最简单入门:java8的lambda中的map相关操作:基础及注意事项图文详解 2   java8的lambda中collect接口案例及原理详解,官方文档解读 3   java8:封装l ...

  6. Java8之lambda表达式略解

    一.什么是lambda表达式? Lambda 表达式,其实就是匿名函数.而函数其实就是功能(function),匿名函数,就是匿名的功能代码了,我们可以把 Lambda 表达式理解为是一段可以传递的代 ...

  7. Java8 利用Lambda处理List集合

    Java 8新增的Lambda表达式,我们可以很方便地并行操作大集合, 刚刚接触java8,Lambda还是挺好用的,目前接触的也不多,给大家举几个例子 1.利用stream().forEach()循 ...

  8. Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法

    今天我来聊聊 Java8 的一些新的特性,确实 Java8 的新特性的出现,给开发者带来了非常大的便利,可能刚刚开始的时候会有点不习惯的这种写法,但是,当你真正的熟悉了之后,你一定会爱上这些新的特性的 ...

  9. JAVA8之lambda表达式

    lambda表达式是java8开始支持的一个特性,方便好用,使用lambda表达式进行编程可以明显提升开发效率,并且在执行效率上也有一定的优化.下面回顾一下lambda表达式的两部分常见用途. 一.针 ...

  10. 提高Java表达能力!不落伍一起掌握Java8中Lambda表达式、函数式接口及方法构造器数组引用

    文章目录 函数式接口概述 函数式接口示例 内置函数式接口 Lambda简述 Lambda语法 方法引用 构造器引用 数组引用 函数式接口概述 只包含一个抽象方法的接口,称为函数式接口. 可以通过 La ...

最新文章

  1. Owncloud-X安装配置
  2. 多路复用select和epoll的区别(转)
  3. 文件操作03——图片文件合成器
  4. 由几道JS笔试题引发的知识点探究
  5. swift面向对象之方法
  6. 田玉靖(1987-),女,北京卡达克数据技术中心软件业务本部中级工程师,主要研究方向为软件架构、编程模式。...
  7. BTC 5分钟内跌幅1.02%,现价38142.29usdt
  8. 异常检测(Anomaly detection): 异常检测算法(应用高斯分布)
  9. (转)ComputerStyle与currentStyle的区别
  10. int main(int argc,char *argv[])该函数中int argc和argv[]两个参数的理解你懂多少?
  11. PLSQL导出表结构
  12. linux scp传输文件权限被拒绝,Linux的远程传输文件scp及出现Permission denied (publickey).lost connection问题解决方法-Go语言中文社区...
  13. 蓝星实物微商城H5源码 附搭建教程
  14. 输油管的布置数学建模matlab,输油管布置的数学模型
  15. 2021年团体程序设计天梯赛题解
  16. (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  17. React(10)-组件通信(important)
  18. windows打不开应用商店,edge浏览器不能登录同步
  19. 3个妙招,克服面试焦虑,紧张
  20. chrome播放rtsp视频使用vgx插件

热门文章

  1. java document to xml_Java Document.asXML方法代碼示例
  2. 调用$.ajax不成功,jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法...
  3. RS232电平 RS485电平 RS422电平 TTL电平
  4. 计算机基础函数运用,计算机应用基础第十二讲:EXCEL中函数的实际运用.doc
  5. x61 linux 驱动 无线网卡,Linux环境Thinkpad X61 4G内存Mtrr表错误
  6. python乱码怎么办_python中输出中文乱码怎么解决
  7. java中hello类,Java入门篇-hello world
  8. win10 iot core java_Windows 10 IoT Core开发环境
  9. Nutanix 以现代化 IT 基础架构推动医共体建设
  10. Go 语言学习总结(4)—— 为什么说 Golang 是面向未来的语言?