java8新增特性(一)---Lambda表达式

Lambda表达式也成为闭包,是java语言层次上的改变,Lambda同意把函数作为一个方法的參数(函数作为參数传递进方法中),或者把代码看成数据。函数式程序猿对这一概念非常熟悉。

在JVM平台上有非常多语言(groovy,scala等等)从一開始就有Lambda,可是程序猿不得不使用匿名类来取代lambda。

看一下jdk7之前实现字符串排序:

package com.panther.dong.java8.lambda;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * Created by panther on 15-8-22.
 */
public class Old {

    public static void main(String[] args) {
        List<String> nameList = Arrays.asList("panther","peter","lucy","jake");
        Collections.sort(nameList, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });
        System.out.println(nameList);

    }
}

执行结果:

仅仅须要给静态方法传入一个List对象以及一个比較器来按制定顺序排列,通常的方法是创建一个匿名的比較器对象然后将其传递给sort方法。

看一下java8怎么用lambda实现上述功能:

package com.panther.dong.java8.lambda;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * Created by panther on 15-8-22.
 */
public class New {

    public static void main(String[] args) {
        List<String> nameList = Arrays.asList("panther", "peter", "lucy", "jake");
        //第一种写法
        Collections.sort(nameList, (String a, String b) -> {
            return b.compareTo(a);
        });
        //另外一种写法
        Collections.sort(nameList, (a, b) -> {
            return b.compareTo(a);
        });
        //第三种写法
        Collections.sort(nameList, (a, b) -> b.compareTo(a));

        nameList.forEach(e -> System.out.println(e));
    }
}

执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

java编译器能够自己主动推导出參数类型。所以你能够不用再写一次类型!!!!

看以下lambda的样例:

代码:

package com.panther.dong.java8.lambda;

import java.util.Arrays;
import java.util.List;

/**
 * Created by panther on 15-8-22.
 */
public class LambdaTest {
    public static String separator = ",";

    public static void main(String[] args) {
        //Lambda能够把函数体放到一对花括号里,就像在java中定义普通函数那样
        System.out.println("-----Lambda Test1-----");
        Arrays.asList("a", "b", "c", "d").forEach(e -> {
            System.out.println(e);
        });

        //Lambda能够引用类的成员变量和局部变量(假设变量不是final的话,它会被隐含的转为final。这样效率更高)
        System.out.println("--------Lambda Test2--------");
        Arrays.asList("a", "b", "c", "d").forEach((String e) -> System.out.println(e + LambdaTest.separator));

        System.out.println("--------Lambda Test3---------");
        List<String> resultList = Arrays.asList("a", "c", "b", "d");
        resultList.sort((e1, e2) -> {
            int result = e1.compareTo(e2);
            return result;
        });

        resultList.forEach(e -> {
            System.out.println(e);
        });
    }
}

执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

Lambda表达式介绍完成。!!!

~~~~~

时间: 06-15

java8新增特性(一)---Lambda表达式的相关文章

Java8新特性之lambda表达式

lambda表达式 简化实例化函数式接口(functional interface)的过程 lambda表达式的优势 简化代码的实现 lambda表达式的语法 一个 Lambda 表达式可以有零个或多个参数 参数的类型既可以明确声明,也可以根据上下文来推断.例如:(int a)与(a)效果相同 所有参数需包含在圆括号内,参数之间用逗号相隔.例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c) 空圆括号代表参数集为空.例如:() -> 42

Java8新特性之lambda

本系列文章翻译自@shekhargulati的java8-the-missing-tutorial Java8中最重要的特性之一就是引入了lambda表达式.这能够使你的代码更加简练,并允许你将行为传递到各处.一段时间以来,Java因为自身的冗长和缺少函数式编程的能力而受到批评.随着函数式编程变得越来越流行和有价值,Java也在努力接受函数式编程.否则,Java将会变得没有价值. Java8在使世界上最受欢迎的编程语言之一在接纳函数式编程的过程中向前迈了一大步.为了支持函数式编程,编程语言必须将

C++11 新特性之 Lambda表达式

lambda表达式可以用于创建并定义匿名的函数对象,以简化编程工作 Lambda的语法如下: [函数对象参数](操作符重载函数参数)->返回值类型{函数体} []内的参数指的是Lambda表达式可以取得的变量.(2)函数中的param就是指函数可以得到在Lambda表达式外的全局变量, 如果在[]中传入=的话,即是可以取得所有的外部变量,如(1)和(3)Lambda表达式 ()内的参数是每次调用函数时传入的参数. ->后加上的是Lambda表达式返回值的类型,如(3)中返回了一个int类型的变

java8 新特性之-----Lambda

Lambda 简介 Lambda 作为一个新的特性添加到jdk中,说明了java对其它语言的支持,吸收其它语言先进的方法.Lambda 表达在java中提供了类型的引用,方法的引用,和默认方法. 对于Lambda的解释在wiki百科看到了就不做翻译保留原味(看看大家的理解,有不同的看法欢迎探讨) Lambda (programming), a function (or a subroutine) defined, and possibly called, without being bound

Java 8 新特性:Lambda 表达式之方法引用(Lambda 表达式补充版)——诺诺&quot;涂鸦&quot;记忆

----------   诺诺学习技术交流博客.期待与您交流!    ---------- 详情请查看:http://blog.csdn.net/sun_promise  方法引用 (注:此文乃个人查找资料然后学习总结的,若有不对的地方,请大家指出,非常感谢!) 1.方法引用简述 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法.方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文.计算时,方法引用会创建函数式接口的一个实例. 当Lambda表达式中

c++11 新特性之lambda表达式

写过c#之后,觉得c#里的lambda表达式和delegate配合使用,这样的机制用起来非常爽.c++11也有了lambda表达式,形式上有细小的差异.形式如下: c#:(input parameters) => {statement;} c++:[capture list](parameter list) -> return type {statement;} c++lambda表达式共分为4各部分.其中parameter list 和 return type 是可以在特定情况下省略的. 一

jdk1.8新特性之lambda表达式及在Android Studio中的使用举例

Jdk1.8已经出很久了但是很多同学对它的特性在android studio 中的应用可能还不是很熟悉,今天我们就来对这个新特性在AS中做它的应用实践. 一.首先在有JDK1.8的情况下我们要在AS的设置中将这个地方设置成java1.8的. 二在build.gradle中添加上这两句 即: compileOptions {    sourceCompatibility 1.8    targetCompatibility 1.8} 这样就完成了使用之前的设置工作了.然后我们进入重要的应用. 那么

&lt;JAVA8新增内容&gt;关于匿名内部集合和lambda表达式

要想说清楚JAVA中的Lambda表达式,必须想讲一下匿名内部类来帮助理解本质. 一.匿名内部类 匿名内部类适合创建那种只需要一次使用的类,例如前面介绍命令模式时所需要的Command对象,匿名内部类的语法有点奇怪,创建匿名内部类时会立即创建一个该类的实例,这个类的定义立即消失,匿名内部类不能重复使用. 语法格式一般如下: new 实现接口() | 父类构造器 (实参列表){ //匿名内部类的类体部分 } 从上面可以看出,匿名内部类必须继承一个父类,或者实现一个接口,但最多只能继承一个父类,或者

Java8之——简洁优雅的Lambda表达式

Java8发布之后,Lambda表达式,Stream等等之类的字眼边慢慢出现在我们字眼.就像是Java7出现了之后,大家看到了“钻石语法”,看到了try-with-resource等等.面对这些新东西,如果它能为我们提供方便带来不一样的改变.那么就值得去尝尝鲜.Java8出现了之后,我就扫了一眼新东西.但是实际工作中普遍使用的是Jdk1.7,1,6.所以就一直“闲置”了.而今闲了就看看. Lambda表达式是怎样的? 下面将通过代码的形式来演示Lambda表达式,需要先安装JDK8.如果开发工具

C++11 Lambda表达式简单解析

C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性, 建议去http://www.open-std.org/看看新标准! 很多语言都提供了 lambda 表达式,如 Python,Java 8 lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么不妨将他们重构成 lambda 表达式. C++11 的 lambda 表达式规范如下: [ capture ] ( params ) mutable