java8 新特性之 Lambda 讲解教程

什么是Lambda

Lambda 是个新的特性添加到java的jdk中,说明了java对其它语言的支持,吸收其它语言先进的方法。Lambda 表达在java中提供了类型的引用,方法的引用,和默认方法。

对于Lambda的解释在wiki百科看到了就不做翻译保留原味(看看大家的理解,有不同的看法欢迎探讨)
Lambda (programming), a function (or a subroutine) defined, and possibly called, without being bound to an identifier
Lambda expression in Lambda calculus, a formal system in mathematical logic and computer science for expressing computation by way of variable binding and substitution
来自: http://medianetwork.oracle.com/video/player/3373491280001

2. 例子

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class LambdaExpresstionTouris {
public static void main(String[] args) {
     List ocuppys1 = new ArrayList();
     ocuppys1.add("bussinessman");
     ocuppys1.add("doctor");
     ocuppys1.add("teacher");
     ocuppys1.add("programer");
     ocuppys1.add("stuedent");
     List ocuppys2 = new ArrayList();
     ocuppys2.add("bussinessman");
     ocuppys2.add("doctor");
     ocuppys2.add("teacher");
     ocuppys2.add("programer");
     ocuppys2.add("stuedent");
     LambdaExpresstionTouris leTouris = new LambdaExpresstionTouris();
     System.out.println("use java 7 sort:");
     System.out.println("before:"+ocuppys1);
     leTouris.sortByJava7(ocuppys1);
     System.out.println("before:"+ocuppys1);
     System.out.println("use java 8 sort:");
     System.out.println("before:"+ocuppys2);
     leTouris.sortByJava8(ocuppys2);
     System.out.println("before:"+ocuppys2);
}
//使用JAVA 7的原始排序方法
private void sortByJava7(List listStr){
    Collections.sort(listStr, new Comparator() {
        public int compare(String s1, String s2) {
            return s1.compareTo(s2);
        }
    });
}
//使用JAVA 8 lambda 表达式进行排序
private void sortByJava8(List listStr){
    Collections.sort(listStr,(s1,s2) -> s1.compareTo(s2));
}
}
总结
1,Lambda 是函数。
2,java8 定义的新的API使用的函数接口
3,默认的函数方法
4,使用它可以来实现方法的引用
5,使用它的排序函数来实现排序
lambda应用阐述    
阐述这技术,我先上一个例子,然后再慢慢深入分析。例子如下:         
namespace 阐述lambda
{
    public class Person
    {
        public string Name { get; set; }
        public int Age  {  get;set; }    
    }
    class Program
    {
        public static List PersonsList()
        {
            List persons = new List();
            for (int i = 0; i < 7; i++)
            {
                Person p = new Person() { Name = i + "儿子", Age = 8 - i, };
                persons.Add(p);                
            }
            return persons;
        }
        static void Main(string[] args)
        {
            List persons = PersonsList();
            persons = persons.Where(p => p.Age > 6).ToList();       //所有Age>6的Person的集合
            Person per = persons.SingleOrDefault(p => p.Age == 1);  //Age=1的单个people类
            persons = persons.Where(p => p.Name.Contains("儿子")).ToList();   //所有Name包含儿子的Person的集合
        }
    }
}

看啦上面的例子,相信你能看出它确实是个甜枣,呵呵,下面我们来看下(p=>p.Age>6)这样的表达式,到底是怎么回事。。

首先我们看下委托  

//委托  逛超市
delegate int GuangChaoshi(int a);
static void Main(string[] args)
{
    GuangChaoshi gwl = JieZhang;
    Console.WriteLine(gwl(10) + "");   //打印20,委托的应用
    Console.ReadKey();
}

//结账
public static int JieZhang(int a)
{
    return a + 10;
}

再看表达式

//委托  逛超市
delegate int GuangChaoshi(int a);
static void Main(string[] args)
{          
   // GuangChaoshi gwl = JieZhang;
    GuangChaoshi gwl = p => p + 10;
    Console.WriteLine(gwl(10) + "");   //打印20,表达式的应用
    Console.ReadKey();
}        

委托跟表达式的两段代码,我们可以看出一些东东吧:其实表达式(p => p + 10;)中的 p 就代表委托方法中的参数,而表达式符号右边的 p+10,就是委托方法中的返回结果。 大侠绕道,小虾理解下。

下面再上两个稍微复杂点的理解理解。

1.多参数的

//委托  逛超市
delegate int GuangChaoshi(int a,int b);
static void Main(string[] args)
{            
    GuangChaoshi gwl = (p,z) => z-(p + 10);
    Console.WriteLine(gwl(10,100) + "");   //打印80,z对应参数b,p对应参数a
    Console.ReadKey();
}

2. lambda主体运算复杂 

/// /// 委托  逛超市
/// /// 花费/// 付钱/// 找零delegate int GuangChaoshi(int a,int b);
static void Main(string[] args)
{
    GuangChaoshi gwl = (p, z) =>
    {
        int zuidixiaofei = 10;
        if (p < zuidixiaofei)
        {
            return 100;
        }
        else
        {
            return z - p - 10;
        }
   
    };
    Console.WriteLine(gwl(10,100) + "");   //打印80,z对应参数b,p对应参数a
    Console.ReadKey();
}

上面这些例子,好好理解下,下面我要介绍一个系统指定的 Fun委托。
Func委托

T 是参数类型,这是一个泛型类型的委托,用起来很方便的。

 先上例子

static void Main(string[] args)
    {
        Func gwl = p => p + 10 + "--返回类型为string";            
        Console.WriteLine(gwl(10) + "");   //打印‘20--返回类型为string’,z对应参数b,p对应参数a
        Console.ReadKey();
    }

说明:我们可以看到,这里的p为int 类型参数, 然而lambda主体返回的是string类型的。

再上一个例子

static void Main(string[] args)
{
    Func gwl = (p, j) =>
        {
            if (p + j == 10)
            {
                return true;
            }
            return false;
        };
    Console.WriteLine(gwl(5,5) + "");   //打印‘True’,z对应参数b,p对应参数a
    Console.ReadKey();
}

说明:从这个例子,我们能看到,p为int类型,j为int类型,返回值为bool类型。

看完上面两个例子,相信大家应该明白啦Func的用法:多个参数,前面的为委托方法的参数,最后一个参数,为委托方法的返回类型。
 lambda表达式树动态创建方法 

static void Main(string[] args)
    {
        //i*j+w*x
        ParameterExpression a = Expression.Parameter(typeof(int),"i");   //创建一个表达式树中的参数,作为一个节点,这里是最下层的节点
        ParameterExpression b = Expression.Parameter(typeof(int),"j");
        BinaryExpression be = Expression.Multiply(a,b);    //这里i*j,生成表达式树中的一个节点,比上面节点高一级
        ParameterExpression c = Expression.Parameter(typeof(int), "w");
        ParameterExpression d = Expression.Parameter(typeof(int), "x");
        BinaryExpression be1 = Expression.Multiply(c, d);
        BinaryExpression su = Expression.Add(be,be1);   //运算两个中级节点,产生终结点
        Expression lambda = Expression.Lambda(su,a,b,c,d);
        Console.WriteLine(lambda + "");   //打印‘(i,j,w,x)=>((i*j)+(w*x))’,z对应参数b,p对应参数a
        Func f= lambda.Compile();  //将表达式树描述的lambda表达式,编译为可执行代码,并生成该lambda表达式的委托;
        Console.WriteLine(f(1, 1, 1, 1) + "");  //打印2
        Console.ReadKey();
    }

上段代码的lambda表达式树,图。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, int
, static
, 参数
, 类型
表达式
java8新特性lambda、java8新特性视频教程、java lambda 教程、java8 lambda教程、java lambda视频教程,以便于您获取更多的相关知识。

时间: 2024-08-18 04:41:35

java8 新特性之 Lambda 讲解教程的相关文章

Java8新特性之Lambda表达式浅析_java

说到java 8,首先会想到lambda(闭包)以及虚拟扩展方法(default method),这个特性早已经被各大技术网站炒得沸沸扬扬了,也是我们java 8系列开篇要讲的第一特性(JEP126 http://openjdk.java.net/jeps/126),jdk8的一些库已经应用了lambda表达式重新设计了,理解他对学习java 8新特性有着重要的意义. 一.函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是

JAVA8新特性

总结提高,与君共勉 上次在一个同学的面经看到,被问到了JAVA8新特性,这个总结不好,转载一篇神文,一起来了解了解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API上的改进,比如流,函数式接口,Map以及全新的日期API "Java is still not dead-and people are starting to figure that out." 本教程

深入浅析JDK8新特性之Lambda表达式_java

第一次是接触Lambda表达式是在TypeScript中(JavaScript的超集中),当时是为了让TypeScript的this方法外而不是本方法内所使用的.使用过后突然想到Lambda不是JDK8的重量级新特性么?于是感觉查阅相关资料并记录下来: 一. 行为参数化 行为参数化简单的说就是函数的主体仅包含模板类通用代码,而一些会随着业务场景而变化的逻辑则以参数的形式传递到函数之中,采用行为参数化可以让程序更加的通用,以应对频繁变更的需求. 考虑一个业务场景,假设我们需要通过程序对苹果进行筛选

浅析C++11新特性的Lambda表达式_C 语言

lambda简介 熟悉Python的程序员应该对lambda不陌生.简单来说,lambda就是一个匿名的可调用代码块.在C++11新标准中,lambda具有如下格式: [capture list] (parameter list) -> return type { function body } 可以看到,他有四个组成部分:     1.capture list: 捕获列表     2.parameter list: 参数列表     3.return type: 返回类型     4.func

.NET 3.x新特性之Lambda表达式

随着岁月的流逝,VS也从2005慢慢的步入2008,.NET也将进入3.5版本,学习的脚步也要慢慢赶上.今天我们来看看C#3.0的又一特性Lambda表达式,它由2.0代理演化而来,也是为LinQ做好必要的准备.Lambda表达式首先我们要知道他的运算符"=>",在我以前的一篇文章中可以得到在不同版本中所使用代理和通过Lambda表达式的一个例子,你可以在这里看到:[C#3.0]新特性概览.今天我们举个另外的例子,让我们更好的理解这个Lambda表达式,因为我们在LinQ中会经常

详谈Java8新特性泛型的类型推导_java

1. 泛型究竟是什么? 在讨论类型推导(type inference)之前,必须回顾一下什么是泛型(Generic).泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是"类型的变量".这种类型变量可以用在类.接口和方法的创建中.理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作: List<Apple> box = new ArrayList<Ap

What&#039;s New in JDK 8 java8新特性汇总

    Oracle甲骨文公司终于在2014年3月发布了Java 8正式版,它是java的一个里程牌版本,带来了诸多新特性.      针对这些新特性汇总如下: 一.针对java编程语言(Java Programming Language)     1.lambda表达式:一种新的语言特性,能够把函数作为方法的参数或将代码作为数据.lambda表达式使你在表示函数接口(具有单个方法的接口)的实例更加紧凑. public class Calculator { interface IntegerMa

java8新特性 (λ、stream 与 默认接口方法)

1.lambda λ表达式本质上是一个匿名方法,用来方便地实现函数接口.也就是说,λ表达式主要用于替换以前广泛使用的内部匿名类.  让我们来看下面这个例子:     public int add(int x, int y) {         return x + y;     } 转成λ表达式后是这个样子:     (int x, int y) -> x + y; 参数类型也可以省略,Java编译器会根据上下文推断出来:     (x, y) -> x + y; //返回两数之和 或者  

Android Studio3.0新特性及安装图文教程

Android Studio是Android的官方IDE.它是专为Android而打造,可以加快您的开发速度,帮助您为每款Android设备构建最优应用. 它提供专为Android开发者量身定制的工具,其中包括丰富的代码编辑.调试.测试和性能分析工具. 一.Android Studio3.0新特性 (1).核心IDE更改 我们将基础IDE从IntelliJ 2016.2升级到2017.1.2,在2016.3和 2017.1中增加了许多新功能, 包括参数提示,语义突出显示,搜索中的即时结果等等.