一、lambda含义
lambda表示数学符号“λ”,计算机领域中λ代表“λ演算”,表达了计算机中最基本的概念:“调用”和“置换”。在很多动态语言和C#中都有相应的lambda语法,这类语法都为了简化代码,提高运行效率。
二、lambda 项目的背景,参考这里。
无论是面向对象语言还是函数式语言,基本数值都可以被动态的封装入程序动作:面向对象语言通过“方法”,函数式语言通过“函数。
介于“方法”和“函数”的定义有很多种,补充下IBM知识库的解释:
在面向对象语言中,方法不是一阶值(First-class value),在函数式语言中,函数是一阶值。在函数式语言中,函数可以作为另一个函数的返回值或参数,还可以作为一个变量的值,函数可以嵌套定义,而在面向对象语言中的的“方法”做不到这点。
Java可以说是面向对象语言的代表,如果要调用其方法,需要先创建对象。不过Java对象都是“重量级”的,实例化具体的类的对象,需要经过定义和申明两个阶段。比如定义方法,并给内部字段赋初始值。但是一个对象只包含一个方法的情况很多,比如实现API中的“回调接口”功能的类,在swing中有接口:
Java代码
public interface ActionListener {
void actionPerformed(ActionEvent e);
}
现有的实现方式大多是:
Java代码
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ui.dazzle(e.getModifiers());
}
});
很多现有的类库都基于这种设计实现,所以对于代码被明确定义运行在单独线程的API来说,匿名内部类尤为重要。这些匿名内部类只存在于创建它的线程中。但是在并行计算领域,CPU的制造商着力发展多核技术来提升CPU的功能,这么做几乎无法依靠多核的优势来提升其性能。
鉴于回调函数和其他功能式语法的关系越来越密切,所以必须建立尽可能的轻量级的数据模型(从编码角度而言,性能方面下文再说)。对于这点来说匿名内部类的缺点如下:
1. 语法相对复杂。
2. 在调用内部类的上下文中,指引和this的指代容易混淆。
3. 类加载和实例创建语法不可避免。
4. 不能引用外部的非final对象。
5. 不能抽象化控制流程
针对这些问题,lambda项目致力于
1. 消除问题1和问题2,通过引入更简单的表达式和局部变量的定义规则。
2. 回避问题3,定义更灵活更友善的语法。这里只是回避,类加载和实例化本身不可避免。下文会解释。
3. 改善问题4,允许用户使用最终有效的局部变量。
不过lambda项目目前并不能解决所有关于内部类的问题。问题4和问题5没有完全解决,这计划在将类版本中继续改善。对于性能方面,原文也没有提,不过后面有些补充。
三、lambda用法
通过上文可以了解到,lambda语法是针对“回调接口”和“匿名内部类”作出的改进,所以lambda的语法目前仅对于部分接口,这些接口的特点是只含一个抽象方法,在lambda项目中,早期称为SAM类型(SAM = single abstract method 即单一抽象方法)。在最新的文档中(即这个版本),它们有了新名字,叫函数接口(functional interface),比如:
1 java.lang.Runnable
2 java.util.concurrent.Callable
3 java.security.PrivilegedAction
4 java.util.Comparator
5 java.io.FileFilter
6 java.nio.file.PathMatcher
7 java.lang.reflect.InvocationHandler
8 java.beans.PropertyChangeListener
9 java.awt.event.ActionListener
10 javax.swing.event.ChangeListener
lambda的语法包括三部分
1、参数列表
2、箭头符号"->"
3、代码块。
其中代码块很像一个方法体,return语句将控制权交还给匿名方法(anonymous method,即lambda表达式)的调用者;break和continue不能出现在函数体的顶部,不过可以出现在内部的循环里;如果代码块得出最终结果,那么每一个控制路径(control path) 必须都有返回或抛出异常。
如果代码块只有简单一行,可以省略return关键字和“{}”符号(以下所写的例子都是基于JDK 1.8 lambda预览版),比如:
Java代码
public class LambdaTest {
public static void main(String... args) {
//这里有{}和return 以及 ;
Runnable r = () -> { System.out.println("hello world"); };
//这里不需要{}和return
java.util.Comparator<String> c = (String s1, String s2) -> s2.length()-s1.length();
r.run();
System.out.println(c.compare("s1", "12323"));
}
}
输出为:
hello world
3
除了这些现有接口,我们还可以自定义函数接口:
Java代码
public class LambdaTest {
interface lambdaInterface {
public void me(String str);
}
public static void main(String... args) {
lambdaInterface li = (String s)->{System.out.println(s);};
li.me("hello world!");
}
}
输出为:
hello world!
新的lambda方法从语法上的确是简化了很多。和lambda第一次发布的语法相比也优雅很多。
分享到:
相关推荐
mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk...
提供两种资源方式:(JDK1.8压缩包64位Windows版本)上面JDK1.8压缩包直接下载(解压一下就可以用),想自己下载的下方官网网址自行查找 官网下载地址:https://www.oracle.com/java/technologies/downloads/ JDK...
Java JDK 1.8免安装版是一款为开发者和用户提供了便捷的Java开发环境的软件包。这个版本的特点在于,它不需要传统的安装过程,也不需要手动配置环境变量,从而简化了Java开发环境的搭建,尤其适合那些希望快速启动...
**JDK 1.8免安装解压缩版详解** JDK(Java Development Kit)是Java编程语言的软件开发工具包,它为Java开发者提供了编译、调试和运行Java应用程序所需的所有工具。JDK 1.8是Oracle公司发布的一个重要版本,其中...
- 设置`JAVA_HOME`环境变量,值为解压后的JDK目录,例如`C:\Program Files\JDK1.8`。 - 修改`PATH`环境变量,添加`%JAVA_HOME%\bin`路径。 3. **验证安装**:打开命令行工具,输入`java -version`,如果正确显示...
- **Lambda表达式**:JDK1.8引入了Lambda表达式,使得函数式编程成为可能,简化了多线程处理和集合操作。 - **Stream API**:Stream API允许对集合进行高效且富有表达性的并行操作,极大地增强了数据处理能力。 -...
在这个"jdk1.8版本免安装"的压缩包中,我们可以找到JDK 1.8.0_181的具体内容,这是一个更新版本,包含了修复的漏洞和性能改进。 首先,JDK 1.8最重要的特性之一是Lambda表达式,它简化了函数式编程,使得处理集合...
JDK 1.8与Eclipse、STS(Spring Tool Suite)和IntelliJ IDEA等主流Java集成开发环境(IDE)的兼容性极佳,使得开发人员能够充分利用这些工具的强大功能,如自动完成、代码分析和调试支持。 总的来说,JDK 1.8因其...
首先,JDK1.8最重要的新特性之一就是Lambda表达式。Lambda表达式是函数式编程的核心概念,它允许将函数作为一个值传递,简化了代码并提高了可读性。通过这种方式,开发者可以更方便地处理集合数据和编写多线程程序。...
JDK 1.8是Java平台标准版(Java SE)的一个重要版本,发布于2014年3月,引入了许多新特性和改进,对开发者来说具有里程碑式的意义。此版本的JDK以其稳定性和高效性受到广泛欢迎,尤其对于初学者和企业级应用开发而言...
1. **Lambda表达式**:这是JDK1.8最具代表性的新特性,它允许开发者以更简洁的方式处理匿名函数。Lambda表达式使得函数式编程风格在Java中变得更加自然,特别是在处理集合操作和事件监听时,如Stream API的使用。 2...
免安装版的JDK 1.8意味着它不需要通过传统安装程序在计算机上安装,而是可以直接解压到指定目录并配置环境变量即可使用。 1. **Java 8的主要特性** - **lambda表达式**:引入了函数式编程的概念,使得处理集合数据...
JDK 1.8引入了Lambda表达式,这是一种简洁的函数式编程语法,使得编写匿名函数变得更加简单。Lambda表达式可以用来替代只包含单个抽象方法的接口的实现类,大大减少了代码量,提高了代码的可读性和可维护性。 ```...
**Java Development Kit (JDK) 1.8 中文版** JDK 1.8,全称为Java Development Kit 1.8,是Oracle公司推出的Java编程语言的一个重要版本。这个版本引入了许多创新特性,旨在提高开发人员的生产力,优化应用程序性能...
这个“jdk1.8-windows”文件很可能是JDK 1.8的Windows平台安装包,适用于在Windows操作系统上开发和运行Java程序。 在Windows系统中安装JDK 1.8的步骤如下: 1. **下载**:首先,你需要从Oracle官方网站或者可信的...
Java Development Kit(JDK)是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。...下载并安装"jdk1.8windows版.zip",你就能开始探索这个强大版本的Java世界了。
1. **Lambda表达式**:JDK 1.8引入了lambda表达式,这是一种更简洁、更易读的方式来表示匿名函数,特别适用于处理函数式编程和集合操作。例如,`Runnable r = () -> System.out.println("Hello, Lambda!");`。 2. *...
JDK 1.8引入了Lambda表达式,这是一种简洁的函数式编程语法,可以用于表示无状态、无副作用的函数。Lambda表达式允许将匿名函数作为方法参数传递,或者用作方法返回值。例如,`Runnable r = () -> System.out....
JDK 1.8作为Java生态系统中的一个重要里程碑,不仅引入了诸如Lambda表达式、Stream API等重大创新,还改进了原有的API和工具集,显著提升了开发效率和程序性能。对于Mac OS X用户来说,通过简单的步骤即可安装配置好...