JDK 1.8 Lambda Expression 的优点与限制

我们知道JDK 1.8新增了Lambda Expression这一特性。

那么,JDK 1.8为什么要新增这个特性呢?

这个特性给JDK 1.8带来了什么好处?

它在JDK 1.8中可以做什么?不可以做什么?

在这篇文章,我打算简单聊聊这些话题。

1. Lambda Expression是什么?

Lambda Expression,又名 Anonymous function,  它起源于Alonzo Church在1936年提出的 lambda calculus。

这是数理逻辑中的一个概念,具体可以看 Anonymous function wiki 词条。

2. JDK 1.8 为什么引入这个特性?

在JDK 1.8之前,我们是没有办法直接将功能作为参数传递给方法的。

但我们可以将功能封装成类,传递给方法。

比如Arrays中的sort(),接收一个Comparator参数来指定排序算法(策略模式):

    /*
     *  java.util.Arrays中的sort静态方法,接收两个参数:T[] a, Comparator<? super T> c。
     *  Comparator是一个接口,含有方法 int compare(T o1, T o2);
     */

    public static <T> void sort(T[] a, Comparator<? super T> c) {
       if (c == null) {
           sort(a);
       } else {
           if (LegacyMergeSort.userRequested)
               legacyMergeSort(a, c);
           else
               TimSort.sort(a,  , a.length, c, null,  ,  );
       }
   }

JDK 1.8 引入这个新特性后,Java 具备了将功能作为参数传递给方法的能力,实现了 code as data(to treat functionality as method argument, or code as data)。函数式语言和一些将函数视作first-class function的语言都支持lambda expression。

Functional Interface出现的地方都可以使用 Lambda Expression。

Lambda Expression使得代码量更少,因此代码更简洁、可读性更强(适合仅使用一次或几次、对复用要求不高的代码)。

JDK 1.8 中的 lambda expression 可以和 aggregate operations 一起使用,使得代码更加简洁、易懂、不易出错。

3. JDK 1.8 中 Lambda Expression 的限制

(1)Lambda Expression 会抛出异常,这样的 lambda expression 不能同 Java 集合框架中的API一起使用;

(2) Lambda Expression 没有引入新的作用域,它可以直接引用 enclosing method 中的 local variable,这些 local variable must be final/effectively final(必须被final修饰,或虽然没有被final修饰,但没有被更改过)。例子可以看Accessing Local Variables of the Enclosing Scope这一节。

原文地址:https://www.cnblogs.com/huangzejun/p/8582494.html

时间: 2024-10-13 15:02:25

JDK 1.8 Lambda Expression 的优点与限制的相关文章

Android 使用Java8新特性之Lambda expression

前言 Lambda expression,java8的新特性.使用Lambda expression,可以替代只有一个函数的接口实现,告别匿名内部类,代码看起来更简洁易懂. java8还有其它一些新特性,不过在android上可能都无法使用. studio 2.x后 支持jack编译器,使用它,能使用java8的Lambda expression,但其它特性也不敢保证就能用. 注:Android SDK中集成了JDK的一些源码,有些原生JDK中的类,可能增加了新特性的一些实现,但Android中

Part 99 Lambda expression in c#

class Program { static void Main(string[] args) { List<Person> persons = new List<Person>() { new Person{ID=101,Name="lin1"}, new Person{ID=102,Name="lin2"}, new Person{ID=103,Name="lin3"} }; Person person = perso

Delegates, Events and Lambda Expression

The content and code of this article is referenced from book Pro C#5.0 and the .NET 4.5 Framework by Apress. The intention of the writing is to review the konwledge and gain better understanding of the .net framework.    Up to this point, most of the

java8函数表达式的定义[Definition of a Lambda Expression]

英文来源于:Java in a Nutshell, 6th Edition Definition of a Lambda Expression A lambda expression is essentially a function that does not have a name, and can be treated as a value in the language. As Java does not allow code to run around on its own outsi

Lambda Expression in C#

1.Expression Expression<Func<double, double>> exp = a => Math.Sin(a); 委托类型Func<double, double>,它限定生成的表达式树是一个接受double,并返回double的一元Lambda函数 <Func<double, double, double, double, double> 输入参数为4个double,返回一个double类型 static void Ma

C++ lambda expression

Emerged since c++11, lambda expression/function is an unnamed function object capable of capturing variables in scope. 1. syntax of a lambda expression [ captures ] <tparams>(optional)(c++20) ( params ) specifiers exception attr -> ret requires(o

java Lambda expression

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表达式可以使代码变的更加简洁紧凑. 语法 lambda 表达式的语法格式如下: (parameters) -> expression 或 (parameters) ->{ statements; } 以下是lambda表达式的重要特征: 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值. 可选的参数圆括号:一个

函数式编程之根-λ表达式(lambda expression)

学习函数式编程的大图(big map)/鸟瞰图,并在没有掌握Scheme的各种语言细节之前,给出Scheme代码.这意味着我们不需要看懂源代码,而是将这里的介绍作为后续学习的大图,使自己知道身在何处: 1930s初,普林斯顿大学的逻辑学家阿伦佐·丘奇 (Alonzo Church,1903-1995) 开发出了一种新的形式系统(formal system),即拉姆达运算/演算 (λ-calculus .lambda calculus ,lambda即希腊字母λ). λ运算的核心是λ表达式,以此形

C++11 lambda表达式(lambda expression)

1.可调用对象(callable object)类别包括: 函数 函数指针 重载了函数调用运算符的类 lambda 表达式 2.lambda表达式形式: [capture list] (parameter list) -> return type { function body } capture list (捕获列表)是一个 lambda 所在函数中定义的局部变量的列表(通常为空),空捕获列表表明此 lambda 不使用它所在的函数中的任何局部变量, return type.parameter