文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Lambda表达式详细总结,理论加案例

2024-12-01 01:54

关注

从1996年1月JDK1.0正式发布到现在,目前有三个主流的长期支持【LTS】版本为JDK8、JDK11、JDK17,因为JDK11并没有特别大的优化更新,46.45%的企业还是使用2014年3月14号发布的JDK8,JDK17使用率仅在0.37%

JDK8重要更新

继《​​JDK8更新——官网原版详解​​》之后,本篇主要介绍一下JDK更新在编码层面的重要变化,也就是我们一线程序员需要掌握的都有哪些,网络上有许多教程,但恰恰是教程太多五花八门,不知所云,一个新特性怼六七个小时实属浪费时间,学无涯生也有涯,很多玩意我们知道就行不需要去掌握,不要去浪费时间,结合实际工作,我总结了如下几点:

小贴士:本篇文章主要讲解Lambda表达式

Lambda表达式

Lambda表达式支持将一个方法【行为】当做参数传递,这种编程方式称为【函数式编程】,这种编程方式最大的特点就是代码紧凑,减少冗余代码,让编程边的更加简洁,而Java最大的弊端就在于代码臃肿,在Python,Scala、JavaScript等语言中也都引入函数式编程,而Java通过Lambda表达式实现函数式编程势在必行!

语法格式

Lembda表达式通过左侧的参数,右侧的表达式和中间的右箭头组成:

// 有参有返回值
(parameter1,parameter12,...) -> {
expression;
...
return xxx;
}
// 无参有返回值
() -> {
expression;
...
return xxx;
}

// 有参无返回值
(parameter1,parameter12,...) -> {
expression;
...
}

// 无参无返回值
() -> {
expression;
...
}

实现原理

重点掌握

无参实现

Lambda表达式实现需要依赖于函数式接口,JDK内置了一些函数式接口,使用Supplier来实现无参Lambda讲解,至于函数式接口怎么自定义在后续单独介绍,保证连贯性,在此不穿插函数式接口其他内容!

Supplier接口为JDK内置的供给型接口,特点为无参数但是有返回值,定义如下:

代码:

package com.stt;

import java.util.function.Supplier;


public class NoArgsMain {
public static void main(String[] args) {
// 1、原始方式实现
Supplier<Integer> s1 = new Supplier<Integer>() {
@Override
public Integer get() {
return 1024;
}
};
// 通过get方法获取返回值
System.out.println(s1.get());

// 2、通过Lambda表达是实现
Supplier<String> s2 = () -> {
return "Lambda实现";
};
// 通过get方法获取返回值
System.out.println(s2.get());
}
}

简化代码:

如果Lambda表达式有返回值且代码体只有一行代码时,return和大括号可以省略不写

// 1、简化后代码如下
public class NoArgsMain {
public static void main(String[] args) {


Supplier<String> s2 = () -> "Lambda实现";
// 通过get方法获取返回值
System.out.println(s2.get());
}
}

// 2、如果有多行,则不可以省略
public class NoArgsMain {
public static void main(String[] args) {
// 通过Lambda表达是实现,因为函数体有其他代码,不可省略return和大括号
Supplier<String> s2 = () -> {
System.out.println("我是Lambda表达式体");
return "Lambda实现";
};
// 通过get方法获取返回值
System.out.println(s2.get());
}
}

有参实现

通过JDK内置Consumer接口实现,接收参数但没有返回值,定义如下:

代码实现:

package com.stt;

import java.util.function.Consumer;

public class HasArgsMain {
public static void main(String[] args){
// 1、原始实现
Consumer<Integer> consumer1 = new Consumer<Integer>() {
@Override
public void accept(Integer param){
// 没有返回值
System.out.println("我是消费型接口,只进不出哦!" + param);
}
};
// 调用accpet方法消费数据
consumer1.accept(1024);

// 2、Lambda写法,
Consumer<String> consumer2 = (str) -> {
System.out.println("我是Lambda消费型接口," + str);
};
consumer2.accept("石添添");
}
}

简化写法:

public class HasArgsMain {
public static void main(String[] args) {

Consumer<String> consumer2 = str -> System.out.println("我是Lambda消费型接口," + str);
consumer2.accept("石添添");
}
}

总结:

如果代码体只有一行代码,无论有无参数,大括号都可省略

如果有返回值,代码体只有一行代码则return可以省略

如果有且仅有一个参数,参数的小括号可以省略,没有参数和有多个参数都不可省略、

有没有那么一点点感觉,Lambda表达式简化了代码,让编码更加简洁,接下来我们通过更多案例对比进一步理解和使用Lambda表达式

Lambda实现线程创建

通过Runnable接口创建线程,如果想使用Lambda那么Runnable应该是一个函数式接口,函数式接口的特点是只有一个抽象方法,Runnable接口定义如下:

代码实现:

public class ThreadMain {
public static void main(String[] args) {
// 1、原始方式创建线程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "线程启动");
}
}).start();

// 2、使用Lambda表达式简写方式创建线程
new Thread(() -> System.out.println(Thread.currentThread().getName() + "线程启动")).start();
}
}

Lambda实现集合遍历

集合操作新增forEach方法,接收一个Consumer类型对象,上边【有参实现】中介绍了,它是一个函数式接口

代码实现:

public class CollectionMain {
public static void main(String[] args){
// 创建集合
List<String> list = new ArrayList<>();
// 添加数据
list.add("艾斯!");
list.add("赛罗!");
list.add("杰克!");
list.add("雷欧!");
// 1、原始遍历方式
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
// 2、因为Consumer是一个函数式接口,可以使用Lambad
// 思考:简写形式怎么实现呢?
list.forEach((str) -> {
System.out.println(str);
});
}
}

Lambda实现集合排序

集合排序可以使用sort方法,sort方法接收一个Comparator类型数据

Comparator接口定义

小贴士:该接口中还有几个默认实现方法和静态方法,因为只有一个抽象方法所以也是函数式接口

代码实现:

public class CollectionSortMain {
public static void main(String[] args) {
List<Person> personList = new ArrayList<>();
personList.add(new Person("李小白",24));
personList.add(new Person("张二三",21));
personList.add(new Person("王五六",30));
// 遍历
System.out.println("排序前-------------------");
personList.forEach(person -> System.out.println(person));
// 排序,参数1 - 参数2为升序排序
System.out.println("排序后-------------------");
personList.sort(new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return p1.getAge() - p2.getAge();
}
});
personList.forEach(person -> System.out.println(person));
// Lambda排序,参数2 - 参数1为降序排序
System.out.println("Lambda排序-------------------");
// 直接简写形式,只有一行代码,大括号和return可以省略
personList.sort((p1,p2) -> p2.getAge() - p1.getAge());
personList.forEach(person -> System.out.println(person));
}
}

总结

Lambda表达式简化开发,使编码变的简洁。

Lambda表达式需要依赖函数式接口实现,一定情况下可以简化写法。

StreamAPI、方法引用等特性需要基于Lambda实现。

Lambda表达式刚开始可能不习惯,多些就好,一定要多用哦!

文章出自:​​添甄​​,如有转载本文请联系【添甄】今日头条号。

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯