Java lambda表达式用法介绍(1)

在这里,我们可以将一个匿名类传递给一个方法。这有助于在Java7中编写代码更少的程序。但是,语法仍然很难,需要很多额外的代码行。

Java8进一步扩展了SAMs的功能。因为我们知道函数接口只有一个方法,所以在将其作为参数传递时,不需要定义该方法的名称。Lambda表达式允许我们完全做到这一点。

##Lambda表达式简介

Lambda表达式本质上是一个匿名或未命名的方法。lambda表达式不会自行执行。相反,它用于实现由函数接口定义的方法。

如何在Java中定义lambda表达式?

下面是如何在Java中定义lambda表达式。

(parameter list) -> lambda body

使用的新运算符(->)称为箭头运算符或lambda运算符。语法目前可能不清楚。让我们来探讨一些例子,

假设我们有这样一种方法:

double getPiValue() {

return 3.1415;

}

我们可以使用lambda表达式编写此方法,如下所示:

() -> 3.1415

这里,该方法没有任何参数。因此,运算符的左侧包含一个空参数。右侧是lambda主体,指定lambda表达式的操作。在本例中,它返回值3.1415。

Lambda体的类型


在Java中,lambda主体有两种类型。

  1. 具有单个表达式的主体

() -> System.out.println(“Lambdas are great”);

这种类型的lambda体称为表达式体。

  1. 由代码块组成的主体。

() -> {

double pi = 3.1415;

return pi;

};

这种类型的lambda体称为块体。块体允许lambda体包含多个语句。这些语句包含在大括号内,必须在大括号后添加分号。

注意:对于块体,如果块体返回值,则可以使用return语句。但是,表达式体不需要返回语句。

示例3:Lambda表达式

让我们编写一个Java程序,使用lambda表达式返回Pi的值。

如前所述,lambda表达式不会单独执行。相反,它形成了由函数接口定义的抽象方法的实现。

因此,我们需要首先定义一个功能接口。

import java.lang.FunctionalInterface;

// this is functional interface

@FunctionalInterface

interface MyInterface{

// abstract method

double getPiValue();

}

public class Main {

public static void main( String[] args ) {

// declare a reference to MyInterface

MyInterface ref;

// lambda expression

ref = () -> 3.1415;

System.out.println("Value of Pi = " + ref.getPiValue());

}

}

输出:

Value of Pi = 3.1415

在上面的例子中,

我们已经创建了一个名为MyInterface的功能接口。它包含一个名为getPiValue()的抽象方法

在主类中,我们声明了对MyInterface的引用。注意,我们可以声明接口的引用,但不能实例化接口。就是,

// it will throw an error

MyInterface ref = new myInterface();

// it is valid

MyInterface ref;

然后,我们为引用指定了一个lambda表达式。

ref = () -> 3.1415;

最后,我们使用引用接口调用方法getPiValue()

System.out.println("Value of Pi = " + ref.getPiValue());

带参数的Lambda表达式


到目前为止,我们已经创建了没有任何参数的lambda表达式。但是,与方法类似,lambda表达式也可以有参数。例如《求职面试笔试宝典》

(n) -> (n%2)==0

这里,括号内的变量n是传递给lambda表达式的参数。lambda主体接受参数并检查它是偶数还是奇数。

示例4:使用带参数的lambda表达式

@FunctionalInterface

interface MyInterface {

// abstract method

String reverse(String n);

}

public class Main {

public static void main( String[] args ) {

// declare a reference to MyInterface

// assign a lambda expression to the reference

MyInterface ref = (str) -> {

String result = “”;

for (int i = str.length()-1; i >= 0 ; i–)

result += str.charAt(i);

return result;

};

// call the method of the interface

System.out.println("Lambda reversed = " + ref.reverse(“Lambda”));

}

}

输出:

Lambda reversed = adbmaL

##通用功能接口

到目前为止,我们使用的函数接口只接受一种类型的值。例如

@FunctionalInterface

interface MyInterface {

String reverseString(String n);

}

上面的函数接口只接受字符串并返回字符串。但是,我们可以使函数接口通用,以便接受任何数据类型。如果您不确定泛型,请访问Java泛型。

示例5:通用函数接口和Lambda表达式

// GenericInterface.java

@FunctionalInterface

interface GenericInterface {

// generic method

T func(T t);

}

// GenericLambda.java

public class Main {

public static void main( String[] args ) {

// declare a reference to GenericInterface

// the GenericInterface operates on String data

// assign a lambda expression to it

GenericInterface reverse = (str) -> {

String result = “”;

for (int i = str.length()-1; i >= 0 ; i–)

result += str.charAt(i);

return result;

};

System.out.println("Lambda reversed = " + reverse.func(“Lambda”));

// declare another reference to GenericInterface

// the GenericInterface operates on Integer data

// assign a lambda expression to it

GenericInterface factorial = (n) -> {

int result = 1;

for (int i = 1; i <= n; i++)

result = i * result;

return result;

};

System.out.println("factorial of 5 = " + factorial.func(5));

}

}

输出:

Lambda reversed = adbmaL

factorial of 5 = 120

在上面的示例中,我们创建了一个名为GenericInterface的通用函数接口。它包含一个名为func()的泛型方法。

在这里,在主类中,

  • GenericInterface<String>reverse-创建对接口的引用。该接口现在对字符串类型的数据进行操作。

  • GenericInterface<Integer>factorial-创建对接口的引用。在本例中,接口对整型数据进行操作。

Lambda表达式和StreamAPI


新的java.util.stream包已添加到JDK8中,它允许java开发人员执行搜索、筛选、映射、减少或操作列表等集合。

例如,我们有一个数据流(在本例中是一个字符串列表),其中每个字符串都是国家名称和国家地点的组合。现在,我们可以处理这些数据流,只从尼泊尔检索地方。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

Ending

Tip:由于文章篇幅有限制,下面还有20个关于MySQL的问题,我都复盘整理成一份pdf文档了,后面的内容我就把剩下的问题的目录展示给大家看一下

如果觉得有帮助不妨【转发+点赞+关注】支持我,后续会为大家带来更多的技术类文章以及学习类文章!(阿里对MySQL底层实现以及索引实现问的很多)

吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
aed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

Ending

Tip:由于文章篇幅有限制,下面还有20个关于MySQL的问题,我都复盘整理成一份pdf文档了,后面的内容我就把剩下的问题的目录展示给大家看一下

如果觉得有帮助不妨【转发+点赞+关注】支持我,后续会为大家带来更多的技术类文章以及学习类文章!(阿里对MySQL底层实现以及索引实现问的很多)

[外链图片转存中…(img-vamTzhsE-1713389916725)]

[外链图片转存中…(img-lYfuy0b8-1713389916725)]

吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 29
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值