3分钟入门lambda表达式
本节是lambda表达式的一个入门课,讲解的同时配有练习demo
前言什么是lambda表达式?基础语法函数式接口自己实现一个函数式接口jdk提供的函数式接口ConsumersupplierfunctionPredicate其他场景
前言
lambda表达式是java8推出的一个新特性。标志着从jdk1.8开始,java正式支持函数式编程。使用lambda表达式可以用简洁流畅的代码完成一个功能,这也在一定程度上,可以减轻了java一直为人诟病的代码简洁性问题。
什么是lambda表达式?
lambda表达式可以简单理解为一段可以传递的代码,核心思想是将面向对象中传递数据变为传递行为。下面举一个编写线程的例子。
1Runnable runnable = new Runnable() {
2 @Override
3 public void run() {
4 System.out.println("hello lambda");
5 }
6};
这里使用的是匿名内部类的方式。匿名内部类实现的也是将代码作为数据传递,不过使用匿名内部类还是不够简洁,那么使用lambda表达式的代码是什么样的呢?
1Runnable runnable = () -> System.out.println("hello lambda");
我们可以看到使用lambda表达式实现起来非常的简单,只需要一行代码即可,接下来我们就试着分析一下这段代码。
基础语法

我们可以将lambda表达式整体看作是一个函数,()存放的是函数的操作数 ->指向的是函数的逻辑,可以用{}包裹起来。
函数式接口
我们可以看到上述的示例代码,lambda表达式的引用变量是一个runnable类型,事实上,java为我们提供了多种变量类型供我们选择,这些类型我们称之为函数式接口。
函数式接口是只有一个方法的接口,用作lambda表达式的类型。比如我们之前提到的Runnable接口
1@FunctionalInterface
2public interface Runnable {
3 /**
4 * When an object implementing interface <code>Runnable</code> is used
5 * to create a thread, starting the thread causes the object's
6 * <code>run</code> method to be called in that separately executing
7 * thread.
8 * <p>
9 * The general contract of the method <code>run</code> is that it may
10 * take any action whatsoever.
11 *
12 * @see java.lang.Thread#run()
13 */
14 public abstract void run();
15}
我们可以看到interface上一个注解@FunctionInterface,它的作用是告诉编译器这个接口是一个函数式接口。
自己实现一个函数式接口
我们可以自己实现一个函数式接口,判断数据的数据是否合法
1/**
2 * 自定义函式数接口
3 *
4 * @author jialin.li
5 * @date 2020-03-18 14:22
6 */
7@FunctionalInterface
8public interface CustomFunctionInterface<T> {
9 boolean legal(T t);
10}
测试方法:
1/**
2 * 测试.
3 *
4 * @author jialin.li
5 * @date 2020-03-18 14:23
6 */
7public class Test {
8
9 public boolean legal(int value, CustomFunctionInterface<Integer> functionInterface){
10 return functionInterface.legal(value);
11 }
12
13 public static void main(String[] args) {
14 System.out.println(new Test().legal(-8, (x) -> x >= 0));
15 }
16}
测试结果:
1false
jdk提供的函数式接口
jdk在java.util.function中为我们提供了非常丰富的函数式接口,大致可以分为4类:

接下来我们会针对这四种不同的接口,给出相应的demo,你也可以先看题目,自己尝试写一下
Consumer
将输入的10进制数,转换为2进制数输出
1public void toBinaryString(int value, Consumer<Integer> consumer){
2 consumer.accept(value);
3}
4
5public static void main(String[] args) {
6 new Test().toBinaryString(15, (x) -> System.out.println(Integer.toBinaryString(x)));
7}
supplier
生成n个随机数100以内的随机数,以数组的形式返回
1public int[] getRandomArr(int n, Supplier<Integer> supplier) {
2 int[] arr = new int[n];
3 for (int i = 0; i < n; i++) {
4 arr[i] = supplier.get();
5 }
6 return arr;
7}
8
9public static void main(String[] args) {
10 int[] arr = new Test().getRandomArr(10, () -> new Random().nextInt(100));
11 System.out.println(Arrays.toString(arr));
12}
function
生成一个[1,n]组成的阶乘数组,例如输入3,返回[1,4,9]
1public int[] getFactorialArr(int n, Function<Integer,Integer> function) {
2 int[] arr = new int[n];
3 for (int i = 1; i <= n; i++) {
4 arr[i - 1] = function.apply(i);
5 }
6 return arr;
7}
8
9public static void main(String[] args) {
10 int[] arr = new Test().getFactorialArr(10, (x) -> x*x);
11 System.out.println(Arrays.toString(arr));
12}
Predicate
判断一个数是否是偶数
1public boolean isEven(int n, Predicate<Integer> predicate) {
2 return predicate.test(n);
3}
4
5public static void main(String[] args) {
6 boolean isEven = new Test().isEven(1102, (x) -> (x % 2 == 0));
7 System.out.println(isEven);
8}
其他场景
除了上述的4个接口,java.util.function中还有许多其他的接口,可以实现各种功能。比如实现2个数的加法运算:
1public static void main(String[] args) {
2 BinaryOperator<Integer> binaryOperator = Integer::sum;
3 System.out.println(binaryOperator.apply(1, 3));
4}
实现List遍历:
1public static void main(String[] args) {
2 List<String> list = new ArrayList<>(Arrays.asList("java", "python", "go", "sql"));
3 list.forEach(System.out::println);
4}
更多场景还请您去探索,感受函数式编程的魅力吧
最后,期待您的订阅和点赞,专栏每周都会更新,希望可以和您一起进步,同时也期待您的批评与指正!

3分钟入门lambda表达式的更多相关文章
- Linq快速入门——Lambda表达式的前世今生
Linq快速入门——Lambda表达式的前世今生 Lambda表达式其实并不陌生,他的前生就是匿名函数,所以要谈Lambda表达式,就不得不谈匿名函数,要谈匿名函数,那又要不得不谈委托. 何为委托 ...
- java8 快速入门 lambda表达式 Java8 lambda表达式10个示例
本文由 ImportNew - lemeilleur 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发 ...
- Java 8新增的Lambda表达式
一. 表达式入门 Lambda表达式支持将代码块作为方法参数,lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例,相当于一个匿名的方法. 1.1 La ...
- 深入浅出java 8 lambda表达式--零基础一分钟入门
lambda从使用上来说,第一感觉直白的理解就是,少了很多不必要的匿名回调类的写法,比如: public static void main(String[] args) { PlatformQuery ...
- 30分钟入门Java8之lambda表达式
前言 Google在今年发布Android N开发者预览版,一并宣布开始支持Java 8.我们终于能在Android开发中使用到Java8的一些语言特性了.目前支持: 默认方法 lambda表达式 多 ...
- Java Lambda表达式入门
Java Lambda表达式入门 http://blog.csdn.net/renfufei/article/details/24600507 Java 8十个lambda表达式案例 http://w ...
- Linq To sql入门练习 Lambda表达式基础
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 十分钟学会Java8的lambda表达式和Stream API
01:前言一直在用JDK8 ,却从未用过Stream,为了对数组或集合进行一些排序.过滤或数据处理,只会写for循环或者foreach,这就是我曾经的一个写照. 刚开始写写是打基础,但写的多了,各种乏 ...
- Funq之Lambda表达式入门
今天接受了一个Tranning关于.net3.5 framework中的new feature. 其中最不明白的还是Lambda表达式.回来后又仔细的思考了一番,总算有点体会在这里写一下.既然是入门, ...
随机推荐
- AD复制问题汇总
1:文件复制服务NtFrs 13568报错的解决方法 解决方法: 建议不要按照日志的提示进行操作,正确的操作应该是 出现这个问题的原因,是由于在硬件的损坏,导致服务器未正确处理NTFS USN 日志. ...
- mongo的基本命令操作
基本用法学习:https://www.runoob.com/mongodb/mongodb-create-database.html MongoDB数据库基本用法 show dbs:显示数据库列表 s ...
- jQuery中的bind(), live(), on(), delegate()
当我们试图绑定一些事件到DOM元素上的时候,我相信上面这4个方法是最常用的.而它们之间到底有什么不同呢?在什么场合下用什么方法是最有效的呢? 准备知识: 当我们在开始的时候,有些知识是必须具备的: D ...
- 《内蒙古自治区第十二届大学生程序设计竞赛试题_D: 正品的概率》
问题 D: 正品的概率 内存限制:128 MB时间限制:1 S标准输入输出 题目类型:传统评测方式:文本比较上传者:外部导入 提交:36通过:7 返回比赛提交提交记录 题目描述 袋中有m枚正品硬币,n ...
- Ajax 请求参数过多导致 400 错误 and BCryptPasswordEncoder 加密判断
2019/06/19 先分享一种密码加密方式: Spring Security 提供了 BCryptPasswordEncoder类, 实现Spring的PasswordEncoder接口使用BCry ...
- 基于Jquery的textarea滚动条插件(原创)
之前项目中自己写的滚动条插件.先前太忙没有好好整理.现在项目间歇期拿出来整理后贴出来 Demo Here css 我是把mCustomScrollbar 的UI 扣下来的. 这里我要介绍下这个插件不错 ...
- jprofiler监控tomcat
jprofiler监控tomcat https://www.cnblogs.com/yjd_hycf_space/p/7727757.html https://www.jianshu.com/p/c3 ...
- JavaScript深入浅出-闭包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 function (){ var localVal ...
- ERROR: Error in Log_event::read_log_event(): 'Found invalid event in binary log', data_len: 31, event_type: 35报错处理
centos7系统MySQL5.7在用mysqlbinlog命令查询binlog日志时刚开始查询即自动终止查询,查了一下该日志有300M,于是仔细看发现有报错,见下图: 在网上查找经验贴http:// ...
- 百度测试架构师眼中的百度QA
百度测试架构师眼中的百度QA(一) 发表于2013-04-09 15:31| 4004次阅读| 来源架构师Jack的个人空间| 13 条评论| 作者董杰 百度测试QA 摘要:一直以来百度质量部在业 ...