Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口。下面这个例子就是使用Lambda语法来代替匿名的内部类,代码不仅简洁,而且还可读。
没有使用Lambda的老方法:
1
2
3
4
5
button.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent actionEvent){
        System.out.println("Action detected");
    }
});
使用Lambda:
1
2
3
button.addActionListener( actionEvent -> { 
    System.out.println("Action detected");
});
让我们来看一个更明显的例子。
不采用Lambda的老方法:
1
2
3
4
5
6
Runnable runnable1=new Runnable(){
@Override
public void run(){
    System.out.println("Running without Lambda");
}
};
使用Lambda:
1
Runnable runnable2=()->System.out.println("Running from Lambda");
正如你所看到的,使用Lambda表达式不仅让代码变的简单、而且可读、最重要的是代码量也随之减少很多。然而,在某种程度上,这些功能在Scala等这些JVM语言里已经被广泛使用。
并不奇怪,Scala社区是难以置信的,因为许多Java 8里的内容看起来就像是从Scala里搬过来的。在某种程度上,Java 8的语法要比Scala的更详细但不是很清晰,但这并不能说明什么,如果可以,它可能会像Scala那样构建Lambda表达式。
一方面,如果Java继续围绕Lambda来发展和实现Scala都已经实现的功能,那么可能就不需要Scala了。另一方面,如果它只提供一些核心的功能,例如帮助匿名内部类,那么Scala和其他语言将会继续茁壮成长,并且有可能会凌驾于Java之上。其实这才是最好的结果,有竞争才有进步,其它语言继续发展和成长,并且无需担心是否会过时。
 
 
 

lambda简介

lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”。运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体。

lambda表达式:

1.一个参数:param=>expr

2.多个参数:(param-list)=>expr

上面这些东西,记着,下面我们开始应用并阐述lambda,让你乐在其中。

lambda应用阐述

阐述这技术,我先上一个例子,然后再慢慢深入分析。例子如下:

  1. namespace 阐述lambda
  2. {
  3. public class Person
  4. {
  5. public string Name { get; set; }
  6. public int Age { get;set; }
  7. }
  8. class Program
  9. {
  10.  
  11. public static List<Person> PersonsList()
  12. {
  13. List<Person> persons = new List<Person>();
  14. for (int i = 0; i < 7; i++)
  15. {
  16. Person p = new Person() { Name = i + "儿子", Age = 8 - i, };
  17. persons.Add(p);
  18. }
  19. return persons;
  20. }
  21.  
  22. static void Main(string[] args)
  23. {
  24. List<Person> persons = PersonsList();
  25. persons = persons.Where(p => p.Age > 6).ToList(); //所有Age>6的Person的集合
  26. Person per = persons.SingleOrDefault(p => p.Age == 1); //Age=1的单个people类
  27. persons = persons.Where(p => p.Name.Contains("儿子")).ToList(); //所有Name包含儿子的Person的集合
  28. }
  29. }
  30. }

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

首先我们看下委托

  1. //委托 逛超市
  2. delegate int GuangChaoshi(int a);
  3. static void Main(string[] args)
  4. {
  5. GuangChaoshi gwl = JieZhang;
  6. Console.WriteLine(gwl(10) + ""); //打印20,委托的应用
  7. Console.ReadKey();
  8. }
  9.  
  10. //结账
  11. public static int JieZhang(int a)
  12. {
  13. return a + 10;
  14. }

再看表达式

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

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

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

1.多参数的

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

2. lambda主体运算复杂

  1. /// <summary>
  2. /// 委托 逛超市
  3. /// </summary>
  4. /// <param name="a">花费</param>
  5. /// <param name="b">付钱</param>
  6. /// <returns>找零</returns>
  7. delegate int GuangChaoshi(int a,int b);
  8. static void Main(string[] args)
  9. {
  10. GuangChaoshi gwl = (p, z) =>
  11. {
  12. int zuidixiaofei = 10;
  13. if (p < zuidixiaofei)
  14. {
  15. return 100;
  16. }
  17. else
  18. {
  19. return z - p - 10;
  20. }
  21.  
  22. };
  23. Console.WriteLine(gwl(10,100) + ""); //打印80,z对应参数b,p对应参数a
  24. Console.ReadKey();
  25. }

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

Func<T>委托

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

先上例子

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

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

再上一个例子

  1. static void Main(string[] args)
  2. {
  3. Func<int, int, bool> gwl = (p, j) =>
  4. {
  5. if (p + j == 10)
  6. {
  7. return true;
  8. }
  9. return false;
  10. };
  11. Console.WriteLine(gwl(5,5) + ""); //打印‘True’,z对应参数b,p对应参数a
  12. Console.ReadKey();
  13. }

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

看完上面两个例子,相信大家应该明白啦Func<T>的用法:多个参数,前面的为委托方法的参数,最后一个参数,为委托方法的返回类型。

lambda表达式树动态创建方法

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

Lambda Expression的更多相关文章

  1. hdu 1031 (partial sort problem, nth_element, stable_partition, lambda expression) 分类: hdoj 2015-06-15 17:47 26人阅读 评论(0) 收藏

    partial sort. first use std::nth_element to find pivot, then use std::stable_partition with the pivo ...

  2. Part 99 Lambda expression in c#

    class Program { static void Main(string[] args) { List<Person> persons = new List<Person> ...

  3. 浅析Java 8新特性Lambda Expression

    什么是Lambda Expression 对于Lambda Expression,我的理解是,它是一个函数表达式,如下: (int x, int y) -> x - y 符号左边定义了函数的输入 ...

  4. Variable used in lambda expression should be final or effectively final

    Lambda与匿名内部类在访问外部变量时,都不允许有修改变量的倾向,即若: final double a = 3.141592; double b = 3.141592; DoubleUnaryOpe ...

  5. JDK 8 - Lambda Expression 的优点与限制

    我们知道 JDK 8 新增了 Lambda Expression 这一特性. JDK 8 为什么要新增这个特性呢? 这个特性给 JDK 8 带来了什么好处? 它可以做什么?不可以做什么? 在这篇文章, ...

  6. Lambda Expression in C#

    1.Expression Expression<Func<double, double>> exp = a => Math.Sin(a); 委托类型Func<dou ...

  7. 关于 lambda expression 返回值的类型转换

    lambda expression(lambda 表达式,$\lambda$ 表达式) 是 C++ 11 引入的特性. 一般而言,lambda 表达式的返回值类型可不指定,而由返回值推断. 需要注意的 ...

  8. C++ lambda expression

    Emerged since c++11, lambda expression/function is an unnamed function object capable of capturing v ...

  9. 三元運算子回傳lambda expression

    紀錄一下 假如我想要透過三元運算子?: 傳回lambda expression 要明確轉型

随机推荐

  1. Web从入门到放弃<8>

    Ref: Cameron D. - HTML5, JavaScript and jQuery (Programmer to Programmer) - 2015 http://www.runoob.c ...

  2. fiddler抓包工具

    转载: http://www.cr173.com/html/15341_1.html https://www.cnblogs.com/shihaiming/p/5887654.html 软件简介: 数 ...

  3. undefined reference to `pthread_create'

    问题描述: ubuntu 16.04  下  C语言开发环境, 已经添加了头文件#include <pthread.h> 以及在Makefile中添加了 -lpthread,但是编译时仍然 ...

  4. DNS解析类型的区别

    1.A记录:WEB服务器的IP指向 A (Address) 记录是用来指定主机名(或域名)对应的IP地址记录. 就是说:通过A记录,大家可以设置自己的不同域名转到不同的IP上去!如: www.dns. ...

  5. 【原创】运维基础之Redis(1)简介、安装、使用

    redis 5.0.3 官方:https://redis.io/ 一 简介 Redis is an open source (BSD licensed), in-memory data structu ...

  6. 加密:HashUtils,RSAUtil,AESUtils

    import java.security.MessageDigest; public class HashUtils { public static String getMD5(String sour ...

  7. 微信H5支付证书过滤

    在对接微信支付,退款的时候,遇到 Caused by: java.lang.RuntimeException: java.io.IOException: DerInputStream.getLengt ...

  8. 如何破解Excel VBA密码

    首先,如果文件格式是(.xslm),需要先打开Excel文件,另存为2003版格式(.xls). 然后用普通的文本编辑器(我用的是NotePad++)打开这个文件,注意文件类型选“所有文件”. 然后在 ...

  9. Java Spring Boot VS .NetCore (七) 配置文件

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  10. spring+redis的集成,使用spring-data-redis来集成

    1.参考:https://www.cnblogs.com/qlqwjy/p/8562703.html 2.首先创建一个maven项目.然后加入依赖的jar包就行了.我加入的jar包很多,反正加入了也没 ...