教程集 www.jiaochengji.com
教程集 >  脚本编程  >  java  >  正文 java8 新特性之 Lambda 讲解教程

java8 新特性之 Lambda 讲解教程

发布时间:2016-10-18   编辑:jiaochengji.com
教程集为您提供java8 新特性之 Lambda 讲解教程等资源,欢迎您收藏本站,我们将为您提供最新的java8 新特性之 Lambda 讲解教程资源
lambda运算符:所有的lambda表达式都是用新的lambda运算符 => ,可以叫他,“转到”或者 “成为”。本文我们通过实例业讲讲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. 例子

<pre class="brush:java;toolbar:false">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的集合         }     } }</pre>




看啦上面的例子,相信你能看出它确实是个甜枣,呵呵,下面我们来看下(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主体运算复杂 

<pre class="brush:java;toolbar:false">/// /// 委托  逛超市 /// /// 花费/// 付钱/// 找零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(); }</pre>




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

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

 先上例子
</t></t>

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


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

再上一个例子

<pre class="brush:java;toolbar:false">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(); }</pre>


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

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

</t>

<pre class="brush:c#;toolbar:false">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();     }</pre>




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


http://images.cnitblog.com/blog/398358/201306/30204344-7720b43a20214276883071a1ebb15b02.jpg

您可能感兴趣的文章:
java8 新特性之 Lambda 讲解教程
Python中lambda表达式的优缺点及使用场景
python中的lambda是什么意思
Java 8 新特性之泛型的类型推导
还看不懂同事的代码?Lambda 表达式、函数接口了解一下
python中的匿名函数如何使用?
Java 8中简单Lambda表达式实例程序教程
python里lambda是什么
Java8中聚合操作collect、reduce方法详解
python lambda怎么用

[关闭]
~ ~