Java8-初识Lambda

时间:2022-09-18 11:51:57

廉颇老矣,尚能饭否

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() {
@Override
public 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>() {
@Override
public 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;
} @Override
public 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的构成

Java8-初识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的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。

Java8-初识Lambda

Java8-初识Lambda的更多相关文章

  1. 死磕Lambda表达式(一):初识Lambda

    弱小和无知不是生存的障碍,傲慢才是.--<三体> 什么是Lambda表达式 Lambda表达式是表示可传递匿名函数的一种简洁方式,Lambda表达式没有名称,但是有参数列表.函数主体.返回 ...

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

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

  3. java8的lambda表达式,将List&lt&semi;DTO&gt&semi; 转为 List&lt&semi;DO&gt&semi;

    将List<PhoneDTO>转为List<PhoneDO>,通过java8的lambda表达式来操作,比传统的for循环精简很多: /** * List<PhoneDT ...

  4. Java8一Lambda与函数式接口

    关于Lambda表示在工作学习中会经常用到,但并没有全面的去了解.在这里做一个较为详细的记录供以后学习查阅.主要参考Java 8 Lambda 表达式 引言 Java8之前,我们在使用Runnale创 ...

  5. 学习Java8系列-Lambda

    Lambda演进 小王在公司正在开发一个学生管理系统,产品经理向他提出一个需求,要筛选出年龄大于15的学生,于是小王写出了以下代码:     public static List<Student ...

  6. java8的lambda表达式

    关于java8的lambda表达式 lambda表达式一般用于接口,因为lambda表达式是函数式编程. 1.有且仅有一个抽象方法被称为函数式接口,函数式接口可以显示的被@FunctionalInte ...

  7. Java8的Lambda表达式,你会不?

    目录 理解Lambda 基础语法 函数式接口 常用的函数式接口 消费型接口 供给型接口 断言型接口 函数型接口 方法引用 数组引用 构造器引用 总结 参考阅读 理解Lambda Lambda表达式可以 ...

  8. java8中lambda表达式的应用,以及一些泛型相关

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...

  9. java8之lambda表达式(1)-基本语法

    lambda表达式,即带有参数的表达式,为更清晰地理解lambda表达式,先看如下例子: (1) class Student{ private String name; private Double ...

  10. java8之lambda表达式入门

    1.基本介绍 lambda表达式,即带有参数的表达式,为了更清晰地理解lambda表达式,先上代码: 1.1 两种方式的对比 1.1.1 方式1-匿名内部类 class Student{ privat ...

随机推荐

  1. 书&lowbar;&lowbar;Oracle

    1.高可用性 1.1.ORACLE数据高可用之路 1.2.Oracle数据库进阶-高可用性.性能优化和备份恢复 2. 3. 4. 5.

  2. ios辅助功能之voiceover实战

      一个元素朗读的内容可分为以下4个部分(4部分按先后顺序朗读) 1. Label:元素的标题 2. Value:元素的值(可选) 3. Traits:元素的特征,即类型,包含: 按钮/链接/搜索框/ ...

  3. storm源码之一个class解决nimbus单点问题【转】

    本文导读: storm nimbus 单节点问题概述 storm与解决nimbus单点相关的概念 nimbus目前无法做到多节点的原因 解决nimbus单点问题的关键 业界对nimbus单点问题的努力 ...

  4. 一种将Region转为Polyline的方法

    在AutoCAD.NET二次开发中,如果要将面域转为Polyline主要有以下几种方式: 1.使用Explode将面域炸成Line和Arc,然后再串起来,此方法可用于AutoCAD2007开始的所有版 ...

  5. 微信wap开发,页面显示元素不全-微信开发(asp&period;net)

    最近在开发的微信的微商城,出现这样一种情况: pc上浏览正常,但是一到手机上浏览就会缺少部分元素 解决办法: 找了很多原因,还通过uc浏览器把网页到存下来了,发现并没有缺少元素,只是没有显示出来,后来 ...

  6. Go语言 字符串

    在所有编程语言中都涉及到大量的字符串操作,可见熟悉对字符串的操作是何等重要. Go中的字符串和C#中的一样(java也是),字符串内容在初始化后不可修改. 需要注意的是在Go中字符串是有UTF-8编码 ...

  7. LightOJ 1074 Extended Traffic SPFA 消负环

    分析:一看就是求最短路,然后用dij,果断错了一发,发现是3次方,有可能会出现负环 然后用spfa判负环,然后标记负环所有可达的点,被标记的点答案都是“?” #include<cstdio&gt ...

  8. 静态代码检查工具 cppcheck 的使用

      CppCheck是一个C/C++代码缺陷静态检查工具.不同于C/C++编译器及其它分析工具,CppCheck只检查编译器检查不出来的bug,不检查语法错误.所谓静态代码检查就是使用一个工具检查我们 ...

  9. SSH私用私钥登陆

    1.导入私钥,将私钥文件放到当前登陆用户目录下的.ssh目录下 2.指定私钥登陆,ssh -i .ssh/ssh_rsa  root@target.com 如果出现了下面这种情况 这是因为私钥文件权限 ...

  10. 在Intellij IDEA下通过Hibernate逆向生成实体类

    前言:在IDEA中,通过相关插件,可以利用Hibernate逆向生成数据表对应的实体类.具体操作及注意事项见本篇随笔. 1.创建一个基于maven的hibernate工程.并在工程中添夹hiberna ...