对于那些不熟悉函数式编程的人来说,基本的Java lambda语法起初可能有点令人生畏。但是,一旦将lambda表达式分解为它们的组成部分,语法很快就会变得有意义并变得非常自然。

Java中lambda表达式的目标是实现单个方法。所有Java方法都有一个参数列表和一个正文,因此毫不奇怪这两个元素是Java lambda语法的重要组成部分。此外,Java lambda语法用箭头分隔这两个元素。因此,要学习Java lambda语法,您需要熟悉它的三个组成部分:

  1. 参数列表
  2. 箭头
  3. 方法体

要应用这些概念,我们首先需要一个功能接口。功能接口是仅定义必须实现的单个方法的接口。以下是我们将用于此示例的功能接口:

 interface SingleArgument {
public void foo(String s);
}

此接口的方法需要传入String参数,lambda为SingleArgument接口提供了一个实现,以及对接口的foo方法的几次调用:

 SingleArgument sa1 =  n -> System.out.print(n);
sa1.foo("Let us all");
sa1.foo(" learn lambda syntax");

以下是实现此逻辑的完整类:

 public class LearnJavaLambdaSyntax {

    public static void main(String args[]) {
SingleArgument sa1 = n -> System.out.print(n);
sa1.foo("Let us all");
sa1.foo(" learn lambda syntax");
}
} interface SingleArgument {
public void foo(String s);
}

简明扼要的Java lambda语法

上面演示的实现是高度缩写的。这有时会让新手学习Java lambda语法有点困难。有时候,为代码添加更多的仪式是有帮助的。可以使学习Java lambda语法更容易的一个增强是在方法签名周围放置圆括号并在左侧包含类型声明:

SingleArgument sa2 = (String n) - > System.out.print(n) ;

此外,您可以在右侧的内容周围放置花括号,并使用分号结束每个语句

SingleArgument sa3 = (String n) - > {System.out.print(n); } ;

多行lambda表达式语法

实际上,如果您的方法实现具有多个语句,则需要使用分号和大括号。例如,如果我们想要使用正则表达式,在打印出一段给定的文本之前去除所有空格,我们的Java lambda语法将如下所示:

 (String n) -> {
n = n.replaceAll("\\s","");
System.out.print(n);
}

多参数lambda函数

在此示例中,函数接口中的方法只有一个参数,但多个参数完全有效,只要lambda表达式中的参数数量与功能接口的方法中的数字匹配即可。由于Java是强类型语言,因此对象类型也必须是多态匹配。

以下面的功能接口为例:

 interface MultipleArguments {
public void bar(String s,int i);
}

用于实现此功能接口的高度礼仪式Java lambda语法如下:

 MultipleArguments ma1 = (String p, int x) -> {
System.out.printf("%s wants %s slices of pie.\n", p, x);
};

如您所见,这个lambda表达式利用了多个参数,而不仅仅是一个。

我把这个例子描述为高度仪式,因为我们可以大大降低其冗长度。我们可以删除左边的类型声明,我们可以删除右边的花括号和冒号,因为方法实现中只有一条指令。Java lambda语法的更简洁用法如下:

 ( p, x ) -> System.out.printf ( "%s wants %s slices.\n", p, x )

正如您所看到的,Java lambda语法与传统JDK开发人员习惯的语法略有不同,但与此同时,当您将其分解时,很容易看出所有部分是如何组合在一起的。通过一些练习,开发人员很快就学会了喜欢Java lambda语法。

通过这些示例快速学习Java lambda语法的更多相关文章

  1. Java秘诀!零基础怎样快速学习Java?

    对于零基础想学Java的朋友,其实一开始最应该做的就是定好学习目标和端正学习态度,切记不要三天打鱼两天晒网! 首先你是零基础,现在急需把Java学好,在保证学习质量的同时,用最短的时间学好Java应该 ...

  2. Java 8教程(知识内容详细,快速学习Java 8)

    允许在接口中有默认方法实现 Lambda表达式 函数式接口 方法和构造函数引用 Lambda的范围 内置函数式接口 Predicates Functions Suppliers Consumers C ...

  3. Scala - 快速学习03 - 基础语法

    1- 变量 变量 mutable variable 在程序运行过程中其值可能发生改变的量 关键词var定义变量,定义时直接进行求值 常量 immutable variable 在程序运行过程中其值不会 ...

  4. 学习java Markdown语法

    Markdown学习 标题: #+标题名字+回车 二级标题 ##+标题名字+回车 三级四级一次类推,最多六级 字体 HELLO,World ! HELLO,World ! HELLO,World ! ...

  5. Java学习路线图(如何快速学Java)

    不知不觉从初学Java到现在已经8年了,今天在这里给刚入门和入门不久的小伙伴们一些建议.可能总结的不是很详细,但给出了一个大概的学习路线.希望对大家有帮助哈~ 如何快速学Java 这里我以Java E ...

  6. 2018年如何快速学Java

    前言 只有光头才能变强 提前预警:本文适合Java新手阅读(老手可在评论区给下建议),希望大家看完能有所收获. 一.为什么我要写下这篇文章 1.1直接缘由: 在今天(2018年11月4日)有个同学给我 ...

  7. 零基础的人怎么学习Java

    编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...

  8. 第2天 第一个程序&IDEA安装&Java基础语法

    第一个程序 Hello,World! 随便新建一个文件夹,存放代码 新建一个Java文件 文件后缀名为java Hello.java [注意点]系统可能没有显示后缀名,必须手动打开 编写代码 publ ...

  9. 守护石谈学习Java之路

    ​这次在CSDN Blink发表了几篇关于Java编程学习的小作文,讲述了Java工程师的成长路线.Java学习的技能树和入门工作要关注的核心问题,我继续做一次文章的整合与延展,以文章的形式发表出来, ...

随机推荐

  1. ZKWeb网页框架1.6正式发布

    1.6.0更新的内容有 Dapper改进 更换Dapper.Contrib到Dommel 支持自定义列名的设置 支持忽略未映射的成员 支持插入Guid类型到MySQL数据库 支持JSON序列化类型 遇 ...

  2. 【BZOJ2595】 [Wc2008]游览计划

    BZOJ2595 [Wc2008]游览计划 Solution 考虑这是一个最小费用连通性的问题,既然大家都说这是什么斯坦纳树那就是的吧... 所以我们肯定可以这样设一个dp状态: \(dp_{i,j, ...

  3. AC1000纪念

  4. 【ElasticSearch】:Windows下ElasticSearch+版本安装head

    概述 elasticsearch-head,之前插件plugin方式已废弃,现已改为nodejs的NPM安装,独立WEB服务方式. elasticsearch-head网址:https://githu ...

  5. _tkinter.TclError: image "pyimage1" doesn't exist 解决办法

    _tkinter.TclError: image "pyimage1" doesn't exist 解决办法 1 def logout(self): 2 login.LoginWi ...

  6. Django url分发器

    视图: 视图一般都写在app的views.py中.并且视图的第一个参数永远都是request(一个HttpRequest)对象.这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等.在视 ...

  7. docker学习实践之路[第五站]mysql镜像应用

    拉取mysql镜像 docker pull mysql:5.6 #拉取mysql .6版本的镜像 运行mysql镜像 docker run --name some-mysql --restart=al ...

  8. Spring4 mvc+maven 框架搭建(1)

    这篇博客其实很早就应该写,早在半年前,因为对SpringMVC感兴趣,便自学了一下Spring.一段时间的学习后,对Spring有了一个基本的了解,于是想着自己动手搭建一个SpringMvc的框架出来 ...

  9. volatile双重检查锁定与延迟初始化

    一.基本概念: 1.volatile是轻量级的synchronized,在多核处理器开发中保证了共享变量的“可见性”.可见性的意思是,当一个线程修改一个共享变量时,另一个线程能读到这个修改的值. 2. ...

  10. 生产者消费者模式中条件判断是使用while而不是if

    永远在循环(loop)里调用 wait 和 notify,不是在 If 语句现在你知道wait应该永远在被synchronized的背景下和那个被多线程共享的对象上调用,下一个一定要记住的问题就是,你 ...