理解Lambda表达式和闭包
了解由函数指针到Lambda表达式的演化过程
Lambda表达式的这种简洁的语法并不是什么古老的秘法,因为它并不难以理解(难以理解的代码只有一个目的,那就是吓唬程序员)
#include "stdafx.h"
using namespace System; typedef void(*FunctionPointer)(System::String ^str); void HelloWorld(System::String ^str)
{
Console::WriteLine(str);
Console::ReadLine();
} int main(array<System::String ^> ^args)
{
FunctionPointer fp = HelloWorld;
fp("Hello World");
return ;
}
函数指针
using System;
using System.Collections.Generic;
using System.Text; namespace CharpFunctionPointer {
class Program { delegate void FunctionPointer(string str); static void Main(string[] args) {
FunctionPointer fp = HelloWorld;
fp("Hello World!");
} static void HelloWorld(string str) {
Console.WriteLine(str);
Console.ReadLine();
}
} }
委托
using System;
using System.Collections.Generic;
using System.Text; namespace CharpFunctionPointer {
class Program { delegate void FunctionPointer(string str); static void Main(string[] args) {
FunctionPointer fp = delegate (string s) {
Console.WriteLine(s);
Console.ReadLine();
};
fp("Hello World!");
}
} }
匿名委托
using System;
using System.Collections.Generic;
using System.Text; namespace CharpFunctionPointer {
class Program { delegate void FunctionPointer(string str); static void Main(string[] args) {
FunctionPointer fp =
s => Console.WriteLine(s); fp("Hello World!");
Console.ReadLine();
}
}
}
Lambda表达式
using System;
using System.Collections.Generic;
using System.Text; namespace CharpFunctionPointer {
class Program { static void Main(string[] args) {
Action<string> fp = s => Console.WriteLine(s); fp("Hello World!");
Console.ReadLine();
}
}
}
将Lambda表达式赋值给一个预定义的泛型委托
Lambda表达式和闭包
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq; namespace LambdaClosure {
class Program { static void Main(string[] args) {
UsesClosure();
} static void UsesClosure() {
string toFind = "ed";
var words = new string[] {
"ended","friend","closed","potato"
}; var matches = words.Select(s => s.Contains(toFind));
foreach(var str in matches) {
Console.WriteLine(str);
}
Console.ReadLine();
}
}
}
使用本地变量toFind就会通知编译器生成一个闭包(或包装器类),这样,toFind就不会成为"未定义"
柯里化(Currying)
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq; namespace LambdaCurry {
class Program { static void Main(string[] args) {
Func<int,int,int> longLambda = (x,y) => x + y;
Console.WriteLine(longLambda(,)); //currying
Func<int,Func<int,int>> curry = x => y => x + y;
Console.WriteLine(curry()()); Console.ReadLine();
}
}
}
LambdaCurry
理解Lambda表达式和闭包的更多相关文章
- C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质
前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿 ...
- lambda表达式和闭包
lambda表达式和闭包 熟悉的Javascript或者Ruby的同学,可能对另一个名词:闭包更加熟悉.因为一般闭包的示例代码,长得跟lambda差不多,导致我也在以前很长一段时间对这两个概念傻傻分不 ...
- 浅析匿名函数、lambda表达式、闭包(closure)区别与作用
浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...
- python3 入门 (三) 函数与lambda表达式、闭包
函数 是组织好的.可重复使用的.用来实现单一或相关联功能的代码段. 函数代码块以def关键词开头,后接函数标识符名称和圆括号() 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数 函 ...
- 理解Lambda表达式
1.什么是Lambda表达式 Lambda表达式是一个匿名方法,通常在LINQ中被用来创建委托 简单来说.它是一个没有声明,没有访问修饰符,没有返回值.甚至没有名字的方法. 2.为什么我们需要使用La ...
- LINQ to Objects系列(3)深入理解Lambda表达式
Lambda表达式是学好LINQ很重要的一个知识点,后面的LINQ查询中会大量地使用到Lambda表达式.这篇文章从以下几点进行总结. 1,Lambda表达式的前世今生 2,Lambda表达式的实际运 ...
- Java中的函数式编程(三)lambda表达式
写在前面 lambda表达式是一个匿名函数.在Java 8中,它和函数式接口一起,共同构建了函数式编程的框架. lambda表达式乍看像是匿名内部类的一种语法糖,但实际上,它们是两种本质不同的事物 ...
- C#中委托、匿名函数、Lambda表达式的一些个人理解
0x01定义一个委托,相当于定义一个可以存储方法的特殊变量类型 下面我们看具体的代码,通过代码更好理解 delegate void IntMethodInvoker(int x); 这行代码就是声明一 ...
- Spark中Lambda表达式的变量作用域
通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: package java8test; public class T1 { public static void main( ...
随机推荐
- node(1) npm是什么?node的异步概念
NPM是随同的NodeJS一起安装的包管理工具 他可以做什么? 1.可以从NPM服务器下载别人的东西使用 2.可以把自己的东西传到NPM服务器,让别人下载使用 淘宝的镜像会快一点 cnpm ...
- 深入理解java虚拟机---lanmbda表达式简介(三)
1.lanmbda表达式使用 lanbmda表达式的作用: A: 取代内部类 B;增加对集合的操作,从而增强其性能
- js 变量的声明能提升 初始化不会提升
var x = 5; // 初始化 x elem = document.getElementById("demo"); // 查找元素 elem.innerHTML = x + & ...
- Ubuntu16.04 python import cv2
有些项目源代码里面需要导入cv2,没有安装的话会出现ImportError: No module named cv2. 下面给出如何在ubuntu下安装cv2: 直接在ternimal终端中输入命令: ...
- HTML5中input[type='date']自定义样式
HTML5提供了日历控件功能,缩减了开发时间,但有时它的样式确实不如人意,我们可以根据下面的代码自行修改. 建议:复制下面的代码段,单独建立一个css文件,方便我们修改. /* 修改日历控件类型 */ ...
- C点滴成海------Ubuntu怎么运行C语言
Ubuntu怎么运行C语言 一.安装相关软件 安装vim:输入 sudo apt-get install vim: 安装gcc:输入 sudo apt-get install g++. 二.编写代码 ...
- xampp 忘记密码的处理方式.
网上看到一些方法: 大部分是第一种: 方法一 这个方法, 我使用的时候没有生效. -------------- 后来看到另外一种方法 . 直接替换user表的三个文件. 这个方法成功了. xam ...
- 推荐内置android控件的开源项目alcinoe
开源地址:https://github.com/Zeus64/alcinoe 该控件包,含以下几个控件: 1.基于OpenGL实现的视频播放器 ALVideoPlayer. ALVideoPlayer ...
- 【Java】输出目录结构
import java.io.*; import java.io.File; import java.io.IOException; public class FileUtil { public st ...
- 对于vs出现“This function or variable may be unsafe”
1.项目上右击选择“属性” 2.选择C/C++ ->预处理器 ->预处理器定义 3.添加一行 _CRT_SECURE_NO_WARNINGS 4.点击确定,重新编译成功.