写在前面

前面积极响应读者的需求,写了两篇Java新特性的文章。有小伙伴留言说:感觉Lambda表达式很强大啊!一行代码就能够搞定那么多功能!我想学习下Lambda表达式的语法,可以吗?我的回答是:没问题!这不,Lambda表达式来了!

匿名类到Lambda表达式

我们先来看看从匿名类如何转换到Lambda表达式呢?

这里,我们可以使用两个示例来说明如何从匿名内部类转换为Lambda表达式。

  • 匿名内部类到Lambda表达式

使用匿名内部类如下所示。

Runnable r = new Runnable(){
@Override
public void run(){
System.out.println("Hello Lambda");
}
}

转化为Lambda表达式如下所示。

Runnable r = () -> System.out.println("Hello Lambda");
  • 匿名内部类作为参数传递到Lambda表达式作为参数传递

使用匿名内部类作为参数如下所示。

TreeSet<Integer> ts = new TreeSet<>(new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2){
return Integer.compare(o1, o2);
}
});

使用Lambda表达式作为参数如下所示。

TreeSet<Integer> ts = new TreeSet<>(
(o1, o2) -> Integer.compare(o1, o2);
);

从直观上看,Lambda表达式要比常规的语法简洁的多。

Lambda表达式的语法

Lambda表达式在Java语言中引入了 “->” 操作符, “->” 操作符被称为Lambda表达式的操作符或者箭头操作符,它将Lambda表达式分为两部分:

  • 左侧部分指定了Lambda表达式需要的所有参数。

Lambda表达式本质上是对接口的实现,Lambda表达式的参数列表本质上对应着接口中方法的参数列表。

  • 右侧部分指定了Lambda体,即Lambda表达式要执行的功能。

Lambda体本质上就是接口方法具体实现的功能。

我们可以将Lambda表达式的语法总结如下。

1.语法格式一:无参,无返回值,Lambda体只有一条语句

Runnable r = () -> System.out.println("Hello Lambda");

具体示例如下所示。

@Test
public void test1(){
Runnable r = () -> System.out.println("Hello Lambda");
new Thread(r).start();
}

2.语法格式二:Lambda表达式需要一个参数,并且无返回值

Consumer<String> func = (s) -> System.out.println(s);

具体示例如下所示。

@Test
public void test2(){
Consumer<String> consumer = (x) -> System.out.println(x);
consumer.accept("Hello Lambda");
}

3.语法格式三:Lambda只需要一个参数时,参数的小括号可以省略

Consumer<String> func = s -> System.out.println(s);

具体示例如下所示。

@Test
public void test3(){
Consumer<String> consumer = x -> System.out.println(x);
consumer.accept("Hello Lambda");
}

4.语法格式四:Lambda需要两个参数,并且有返回值

BinaryOperator<Integer> bo = (a, b) -> {
System.out.println("函数式接口");
return a + b;
};

具体示例如下所示。

@Test
public void test4(){
Comparator<Integer> comparator = (x, y) -> {
System.out.println("函数式接口");
return Integer.compare(x, y);
};
}

5.语法格式五:当Lambda体只有一条语句时,return和大括号可以省略

BinaryOperator<Integer> bo = (a, b) -> a + b;

具体示例如下所示。

@Test
public void test5(){
Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
}

6.语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器能够通过上下文推断出数据类型,这就是“类型推断”

BinaryOperator<Integer> bo = (Integer a, Integer b) -> {
return a + b;
};

等同于

BinaryOperator<Integer> bo = (a, b) -> {
return a + b;
};

上述 Lambda 表达式中的参数类型都是由编译器推断得出的。 Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。 Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的“类型推断”。

函数式接口

Lambda表达式需要函数式接口的支持,所以,我们有必要来说说什么是函数式接口。

只包含一个抽象方法的接口,称为函数式接口。

可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。

可以在任意函数式接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。

我们可以自定义函数式接口,并使用Lambda表达式来实现相应的功能。

例如,使用函数式接口和Lambda表达式实现对字符串的处理功能。

首先,我们定义一个函数式接口MyFunc,如下所示。

@FunctionalInterface
public interface MyFunc <T> {
public T getValue(T t);
}

接下来,我们定义一个操作字符串的方法,其中参数为MyFunc接口实例和需要转换的字符串。

public String handlerString(MyFunc<String> myFunc, String str){
return myFunc.getValue(str);
}

接下来,我们对自定义的函数式接口进行测试,此时我们传递的函数式接口的参数为Lambda表达式,并且将字符串转化为大写。

@Test
public void test6(){
String str = handlerString((s) -> s.toUpperCase(), "binghe");
System.out.println(str);
}

运行test6方法,得出的结果信息如下所示。

BINGHE

我们也可以截取字符串的某一部分,如下所示。

@Test
public void test7(){
String str = handlerString((s) -> s.substring(0,4), "binghe");
System.out.println(str);
}

运行test7方法,得出的结果信息如下所示。

bing

可以看到,我们可以通过handlerString(MyFunc<String> myFunc, String str)方法结合Lambda表达式对字符串进行任意操作。

注意:作为参数传递 Lambda 表达式:为了将 Lambda 表达式作为参数传递,接收Lambda 表达式的参数类型必须是与该 Lambda 表达式兼容的函数式接口的类型 。

写在最后

如果觉得文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习Java8新特性。

最后,附上Java8新特性核心知识图,祝大家在学习Java8新特性时少走弯路。

【Java8新特性】Lambda表达式基础语法,都在这儿了!!的更多相关文章

  1. Java8新特性-Lambda表达式是什么?

    目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...

  2. 乐字节-Java8新特性-Lambda表达式

    上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...

  3. java8新特性——Lambda表达式

    上文中简单介绍了一下java8得一些新特性,与优点,也是为本次学习java8新特性制定一个学习的方向,后面几篇会根据上文中得新特性一一展开学习.本文就从java8新特性中比较重要的Lambda表达式开 ...

  4. Java8新特性: lambda 表达式介绍

    一.lambda 表达式介绍 lambda 表达式是 Java 8 的一个新特性,可以取代大部分的匿名内部类,简化了匿名委托的使用,让你让代码更加简洁,优雅. 比较官方的定义是这样的: lambda ...

  5. Java8新特性-Lambda表达式

    1.  什么是Lambda表达式? Lambda表达式就是可以把函数作为参数传递,或者说把代码作为数据传递给函数. 2. Lambda表达式的语法格式 基本语法格式如下: 基本语法下多个变体的说明: ...

  6. Java8新特性 - Lambda表达式 - 基本知识

    A lambda expression is an unnamed block of code (or an unnamed function) with a list of formal param ...

  7. java8新特性-lambda表达式和stream API的简单使用

    一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...

  8. Java8新特性——Lambda 表达式

    Lambda 表达式 ​ ​ ​ ​ ​ ​ ​ ​ Lambda 表达式的实质属于函数式编程. ​ ​ ​ ​ ​ ​ ​ ​ 语法格式为:(parameters) -> expression ...

  9. Java8 新特性lambda表达式(一)初始

    本篇参考Richard Warburton的 java8 Lambdas :Functional Programming for the Masses 学习lambda表达式之前,需要知道什么是函数式 ...

  10. Java8新特性——lambda表达式.(案例:词频统计)

    需求:读入一个文本文件,确定所有单词的使用频率并从高到低排序,打印出所有单词及其频率的排序列表 先用传统方法解: package cn._1.wordfrequency; import java.ut ...

随机推荐

  1. String 对象-->toUpperCase() 方法

    1.定义和用法 将字符串中所有的小写字符转换成大写字符,大写字符保持不变 返回转换后的结果字符串 语法: string.toUpperCase() 注意:不会改变字符串本身,仅以返回值的形式返回结果 ...

  2. 如何提高你使用windows的逼格(windows用成Linux的赶脚)

    一.准备工作 作为一个整洁而有内涵的人,电脑桌面一定要清洁 二.桌面整洁了,软件怎么打开呢?     方案一 方案二.敲重点   我们可以使用终端指令打开windows安装的任意软件: 打开Windo ...

  3. 讲讲HashMap的理解,以及HashMap在1.7和1.8版本的变化(2020/4/16)

    HashMap的适用场景,作用,优缺点

  4. Apache SkyWalking

    Apache SkyWalking 什么是 SkyWalking SkyWalking 是观察性分析平台和应用性能管理系统. 提供分布式追踪.服务网格遥测分析.度量聚合和可视化一体化解决方案. 支持J ...

  5. 当文件目录变得杂乱不堪怎么办,python帮你轻松搞定

    这几天和几个小伙伴,在一起合做一个ppt. 做ppt之前有原版的ppt,和一个word大纲,在制作过程中,又不断添加图片.视频等素材,最终,整个目录变得杂乱不堪(见下图-处理之前) 那我想,可不可以做 ...

  6. 使用jquery清空input 文本框中的内容

    只需要将文本框的值置为空即可: function resetBtn(){ $("#name").val(""); }

  7. SpringBoot系列(九)单,多文件上传的正确姿势

    SpringBoot系列(九)分分钟解决文件上传 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配 ...

  8. Flutter环境安装,ios真机调试

    MAC: 下载Flutter,官网的可能很慢.可以去我的网盘下载, 提取码: 3t6y. 下载完的包会在~/Downloads目录下,我们移到~/opt/flutter目录下. mkdir ./opt ...

  9. Python修改paramiko模块开发运维审计保垒机

    目前市面上,专门做IT审计堡垒机的厂商有很多,他们的产品都有一个特点,那就是基本上每台的售价都在20万以上.像我们做技术的,不可能每次待的公司都是大公司,那么在小公司,是不太可能投资20多万买一台硬件 ...

  10. 进制之间转换——day_01

    一.计算机文件大小单位 b = bit 位(比特) B = Byte 字节 1B = 8b #一个字节等于8位 简写 1Byte = 8 bit 1KB = 1024B 1MB = 1024KB 1G ...