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