拉姆达表达式

拉姆达表达式是创建匿名函数的另一种方法。因此,拉姆达表达式可以赋值给委托。虽然主要在操作LINQ中使用拉姆达表        达式,但是这种表达式也适用于委托和事件。

拉姆达表达式运算符:

所有的拉姆达表达式都是用新的拉姆达运算符“=>”,该运算符讲拉姆达表达式分为两个部分:表达式左边指定了输入参数,      而右边则是拉姆达主体。“=>”有时被描述为“转到”或“成为”

共有两种类型的拉姆达表达式,1.表达式拉姆达,2.语句拉姆达

表达式拉姆达:

在表达式拉姆达中,=>运算符右边的表达式对运算符左边指定的参数执行操作。该表达式的结果成为拉姆达运算符的结果      并返回。

一个参数基本形式为:param=>expr    多个参数基本形式为:(param-list) =>  expr

如果不需要参数则必须使用空的括号。

在java编程中也会经常用到拉姆达表达式,如:

将λ表达式用于替换以前广泛使用的内部匿名类,各种回调,比如事件响应器、传入Thread类的Runnable等。看下面的例子:

Thread oldSchool = new Thread( new Runnable () {
        @Override
        public void run() {
            System.out.println("This is from an anonymous class.");
        }
    } );
    
    Thread gaoDuanDaQiShangDangCi = new Thread( () -> {
        System.out.println("This is from an anonymous method (lambda exp).");
    } );

注意第二个线程里的λ表达式,你并不需要显式地把它转成一个Runnable,因为Java能根据上下文自动推断出来:一个Thread的构造函数接受一个Runnable参数,而传入的λ表达式正好符合其run()函数,所以Java编译器推断它为Runnable。

从形式上看,λ表达式只是为你节省了几行代码。但将λ表达式引入Java的动机并不仅仅为此。Java8有一个短期目标和一个长期目标。短期目标是:配合“集合类批处理操作”的内部迭代和并行处理(下面将要讲到);长期目标是将Java向函数式编程语言这个方向引导(并不是要完全变成一门函数式编程语言,只是让它有更多的函数式编程语言的特性),也正是由于这个原因,Oracle并没有简单地使用内部类去实现λ表达式,而是使用了一种更动态、更灵活、易于将来扩展和改变的策略(invokedynamic)。

λ表达式的更多用法

// 嵌套的λ表达式
    Callable<Runnable> c1 = () -> () -> { System.out.println("Nested lambda"); };
    c1.call().run();

// 用在条件表达式中
    Callable<Integer> c2 = true ? (() -> 42) : (() -> 24);
    System.out.println(c2.call());

// 定义一个递归函数
    private UnaryOperator<Integer> factorial = i -> { return i == 0 ? 1 : i * factorial.apply( i - 1 ); };
    ...
    System.out.println(factorial.apply(3));

在Java中,随声明随调用的方式是不行的,比如下面这样,声明了一个λ表达式(x, y) -> x + y,同时企图通过传入实参(2, 3)来调用它:

int five = ( (x, y) -> x + y ) (2, 3); // ERROR! try to call a lambda in-place

这在C++中是可以的,但Java中不行。Java的λ表达式只能用作赋值、传参、返回值等。

拉姆达表达式相关知识相关推荐

  1. 拉姆达表达式(Lambda Expressions)

    让我们先看一个简单的拉姆达表达式: x=>x/2 这个表达式的意思是:x为参数,对x进行相应的操作后的结果作为返回值. 通过这个拉姆达表达式,我们可以看到: 这个表达式没有任何类型信息,但这并不 ...

  2. C#拉姆达(=)表达式

    前言: 之前小猪曾经分享过自己对C#委托的一点理解 其实在使用委托的过程中我们会大量的使用拉姆达(=>)表达式 介绍: "Lambda表达式"是一个匿名函数,是一种高效的类似 ...

  3. SqlSugar常用查询实例-拉姆达表达式

    SqlSugar支持拉姆达表达式查询,匿名对象参数等,相对还是比较方便好用的. 一.查询列表: //查询列表SqlSugarClient db = SugarContext.GetInstance() ...

  4. java1.8 Lambda拉姆达表达式深入探究

    当我们遇到下面情况时: SingleObj.getInstance().setRunnable(new Runnable() {@Overridepublic void run() {} }); 编译 ...

  5. C# 匿名方法和拉姆达表达式

    "` "`代码如下: using System; using System.Collections.Generic; using System.Linq; using System ...

  6. 匿名函数 和 拉姆达表达式

    匿名函数 匿名方法是创建与特定委托实例相关联的未命名代码块的一种方法.可以通过在代码块后面跟上delegate关键字来创建匿名方法. delegate void print();delegate st ...

  7. 拉姆达表达式学习(2)

    本文转载自:http://www.cnblogs.com/zhouji432600/archive/2010/05/30/1747383.html 在.net3.5里面,委托的定义和实现被大大的简化了 ...

  8. 拉姆达表达式 追加 条件判断 ExpressionFuncT, bool

    拉姆达表达式 追加 条件判断 Expression<Func<T, bool>> 2014/11/13 14:47:59  虫虫飞520   程序员俱乐部   我要评论(0) ...

  9. 拉姆达表达式学习(1)

    我曾经遇到一个项目,项目里面需要经常对一系列的同类型集合进行操作,如对集合进行增加元素,删除集合的指定索引的元素等等. 我们可以使用ArrayList来进行.如 1 ArrayList stringL ...

最新文章

  1. sql2000 转sql2008
  2. 基于NB-IoT的智慧路灯监控系统(NB-IoT专栏—实战篇4:PC应用开发)
  3. 零门槛!手把手教你打造AI应用
  4. 《Java编码指南:编写安全可靠程序的75条建议》—— 指南20:使用安全管理器创建一个安全的沙盒...
  5. 数据结构之查找二叉树
  6. java头像交互式差分演变_一种基于交互式差分进化计算的用户知识需求获取方法与流程...
  7. 四舍五入_从四舍五入谈起
  8. 读写锁SRWLock
  9. 《统计学习方法》的Python 3.6复现,实测可用
  10. util包的简单介绍
  11. kafka面试题简答
  12. 学一点Wi-Fi:WAPI
  13. 一、Python数据挖掘(环境篇——Anaconda与Jupyter Notebook)
  14. winhex数据恢复教程
  15. 广联达只有土建打不开_广联达BIM钢筋算量为什么打开工程是灰屏?工程打不开怎么办?...
  16. 2022年创业项目排行榜前十名,这些你都不知道就别想赚钱了
  17. CarPlay iAP2附件协议
  18. 德国制造和中国制造究竟不同在哪
  19. 咆哮教主网络走红 龅牙哥出台说真相 画皮收视率破新高
  20. Python:str()函数

热门文章

  1. Linux C/C++编程: 文件操作open/close、fopen与freopen/fclose
  2. Matlab中条件语句if详解
  3. 024 - C++ 虚函数
  4. 电脑蓝屏服务器无响应,电脑开机就是蓝屏,一直无响应该怎么处理
  5. 局域网IP地址冲突的原因及其解决方法
  6. python连接wifi_python 连接wifi脚本
  7. 谷歌邮箱lmap服务器填什么_非阿里巴巴邮箱IMAP服务器地址和端口号是什么?
  8. 万豪集团宣布在澳门开设首家W酒店;赣州迎来两家格兰云天阅品牌酒店 | 全球旅报...
  9. python in range函数 (1、10、-1)_python range函数语法以及一些讨论
  10. 条码打印机如何批量打印图片