什么是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视频教程,以便于您获取更多的相关知识。