lambda表达式_Java8 之熟透 Lambda 表达式

点击上方 "程序员小乐"关注公众号, 星标或置顶一起成长

每天早上8点20分, 第一时间与你相约

每日英文

Don’t blame people for disappointing you. Blame yourself for expecting too much.

不要埋怨别人让你失望了。怪你自己期望太多。

每日掏心话

人生之所以精彩,是他愿意全然的接受一切。生命之所以可贵,是他愿意尊重一切的生命。

来自:LanceToBigData | 责编:乐乐

链接:cnblogs.com/zhangyinhua/p/11558510.html

77d4a29f8cf0c596a06e263c296205ad.png

程序员小乐(ID:study_tech)第 640 次推文 图片来自网络

往日回顾:爬虫平台的架构实现和框架的选型

01 Lambda简述

1.1、Lambda概述

Lambda 表达式可以理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。

匿名:它不像普通方法那样有一个明确的名称;

函数:Lambda 表达式是函数是因为它不像方法那样属于某个特定的类,但和方法一样,Lambda 有参数列表、函数主体、返回类型,还可能有可以抛出的异常列表;

传递:Lambda 表达式可以作为参数传递给方法或存储在变量中;

简洁:无需像匿名类那样写很多模板代码;

So That:

lambada 表达式实质上是一个匿名方法,但该方法并非独立执行,而是用于实现由函数式接口定义的唯一抽象方法

使用 lambda 表达式时,会创建实现了函数式接口的一个匿名类实例

可以将 lambda 表达式视为一个对象,可以将其作为参数传递

1.2、Lambda简介

Lambda 表达式是一个匿名函数(对于 Java 而言并不很准确,但这里我们不纠结这个问题)。简单来说,这是一种没有声明的方法,即没有访问修饰符,返回值声明和名称。

Java 中的 Lambda 表达式通常使用语法是 (argument) -> (body):

(arg1, arg2...) -> { body }

(type1 arg1, type2 arg2...) -> { body }

Lambda 表达式举例:

(int a, int b) -> { return a + b; }

() -> System.out.println("Hello World");

(String s) -> { System.out.println(s); }

() -> 42

() -> { return 3.1415 };

1.3、Lambda表达式组成与结构

1.3.1、Lambda表达式组成

Lambda 表达式由参数列表、箭头和 Lambda 主体组成。

(Apple o1, Apple o2) -> Integer.valueOf(o1.getWeight()).compareTo(Integer.valueOf(o2.getWeight()))

参数列表:这里采用了 Comparator 中 compareTo 方法的参数;

箭头:箭头把参数列表和 Lambda 主体分开;

Lambda 主体:表达式就是 Lambda 的返回值;

1.3.2、Lambda表达式结构

1)Lambda 表达式的结构

Lambda 表达式可以具有零个,一个或多个参数。

可以显式声明参数的类型,也可以由编译器自动从上下文推断参数的类型。例如 (int a) 与刚才相同 (a)。

参数用小括号括起来,用逗号分隔。例如 (a, b) 或 (int a, int b) 或 (String a, int b, float c)。

空括号用于表示一组空的参数。例如 () -> 42。

当有且仅有一个参数时,如果不显式指明类型,则不必使用小括号。例如 a -> return a*a。

Lambda 表达式的正文可以包含零条,一条或多条语句。

如果 Lambda 表达式的正文只有一条语句,则大括号可不用写,且表达式的返回值类型要与匿名函数的返回类型相同。

如果 Lambda 表达式的正文有一条以上的语句必须包含在大括号(代码块)中,且表达式的返回值类型要与匿名函数的返回类型相同。

2)有效Lambda 表达式举例

Lambda 表达式

含义

(String s) -> s.length() 表达式具有一个 String 类型的参数并返回一个 int。Lambda 没有 return 语句,因为已经隐含的 return,可以显示调用 return。

(Apple a) -> a.getWeight() > 150 表达式有一个 Apple 类型的参数并返回一个 boolean 值

(int x, int y) -> { System.out.printn("Result"); System.out.printn(x + y)} 表达式具有两个 int 类型的参数而没有返回值(void返回),Lambda 表达式可以包含多行语句,但必须要使用大括号包起来。

() -> 42 表达式没有参数,返回一个 int 类型的值。

(Apple o1, Apple o2) -> Integer.valueOf(o1.getWeight()) .compareTo (Integer.valueOf(o2.getWeight())) 表达式具有两个 Apple 类型的参数,返回一个 int 比较重要。

3)Lambda 表达式的使用举例

使用案例

Lambda 示例

布尔表达式 (List list) -> list.isEmpty()

创建对象 () -> new Apple(10)

消费对象 (Apple a) -> { System.out.println(a.getWeight) }

从一个对象中选择/抽取 (String s) -> s.lenght()

组合两个值 (int a, int b) -> a * b

比较两个对象 `(Apple o1, Apple o2) ->

Integer.valueOf(o1.getWeight())

.compareTo(Integer.valueOf(o2.getWeight()))

02 使用Lambda表达式

2.1、函数式接口

函数式接口就是只定义一个抽象方法的接口,比如 Java API 中的 Predicate、Comparator 和 Runnable 等。

public interface Predicate {boolean test(T t);}public interface Comparator {int compare(T o1, T o2);}public interface Runnable {void run();}

函数式接口作用是什么?

Lambda 表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例(具体说来,是函数式接口一个具体实现 的实例)。你用匿名内部类也可以完成同样的事情,只不过比较笨拙:需要提供一个实现,然后 再直接内联将它实例化。

下面的代码是有效的,因为Runnable是一个只定义了一个抽象方法run 的函数式接口:

//使用LambdaRunnable r1 = () -> System.out.println("Hello World 1");

//匿名类Runnable r2 = new Runnable(){ public void run(){ System.out.println("Hello World 2"); } };

public static void process(Runnable r){ r.run(); }

process(r1); //打印 "Hello World 1"process(r2); //打印 "Hello World 2"//利用直接传递的 Lambda 打印 "Hello World 3"process(() -> System.out.println("Hello World 3"));2.2、通过示例感受Lambda

1)之前做法

Comparator byWeight = new Comparator() {public int compare(Apple a1, Apple a2){return a1.getWeight().compareTo(a2.getWeight());}};

2)现在做法

Comparator byWeight =(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());

3)再通过一个明显的实例

public static void rawUseMethod(){ List names = Arrays.asList("peter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值