lambda表达式来自哪里?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lambda表达式来自哪里?相关的知识,希望对你有一定的参考价值。
lambda表达式来自哪里?
c# 的lambda表达式是出自出于哪里?
引用自 C#首席架构师Anders Hejlsberg 的原话:
http://www.ondotnet.com/pub/a/dotnet/2005/10/31/interview-with-anders-hejlsberg-part-2.html?page=2
lambda expressions and anonymous methods are really just two words for the same thing. The only thing that differs is, "What does the syntax look like?" And the lambda expressions are a further evolution of the syntax.But underneath, they do the same thing. They generate methods. You know, they're in-line methods.
所以:我们要了解 Lambda 表达式 就应该同时也了解 匿名方法。下面先看一个简单的代码例子,分别用匿名方法和Lambda 表达式来实现对数组的搜索:
使用 .net 2.0 的匿名方法来搜索字符串数组中包含 a 的字符串数组
static void Main(string[] args)
string[] list = new string[] "abc", "12", "java" ;
string[] ll = Array.FindAll(list,
delegate(string s)
return s.IndexOf("a") >= 0;
);
foreach (string var in ll)
Console.WriteLine(var);
Console.ReadLine();
使用 .net 3.5 的Lambda表达式来搜索字符串数组中包含 a 的字符串数组
static void Main(string[] args)
string[] list = new string[] "abc", "12", "java" ;
string[] ll = Array.FindAll(list, s => (s.IndexOf("a") >= 0));
foreach (string var in ll)
Console.WriteLine(var);
Console.ReadLine();
从上述两个例子我们可以看出:
从代码书写角度,代码可读性角度来说:Lambda表达式 比匿名方法更简单了。
而 Lambda表达式 和 匿名方法都是干的同一件事情,让我们少写一个函数定义。函数的调用和函数的实现在一起完成了。
Lambda表达式的书写格式如下:
(参数列表) => 表达式或者语句块
其中:
参数个数:可以有多个参数,一个参数,或者无参数。
参数类型:可以隐式或者显式定义。
表达式或者语句块:这部分就是我们平常写函数的实现部分(函数体)。
一些Lambda表达式的书写范例:
有两个参数的 Lambda表达式例子:
注:别看比较复杂,LINQ中实际把 下述代码中的 delegate ,DoSomeThing 替你做了,所以你写代码的时候只需要写
var t = DoSomeThing<int>(7, 8, (x, y) => x * y); 这么一行。
public delegate T HongJunGuoTest01<T>(T t1, T t2);
class Program
private static T DoSomeThing<T>(T t1,T t2,HongJunGuoTest01<T> match)
return match(t1, t2);
static void Main(string[] args)
var t = DoSomeThing<int>(7, 8, (x, y) => x * y);
Console.WriteLine(t);
Console.ReadLine();
下面这些写法也是对的(你只需要修改Main函数中的代码,其他地方不需要动):
var t = DoSomeThing<int>(7, 8, (int x, int y) => x * y);
var t = DoSomeThing<string>("7", "8", ( x, y) => x + y);
或者我们写一个更复杂的: => 右边是一段语句块。
var t = DoSomeThing<int>(7, 8, (x, y) => if (x < 5) return (x + 8) * y; else return y; );
最前面的例子是一个参数的例子,我们就不举一个参数的例子了,下面举一个没有参数的例子:
public delegate void HongJunGuoTest02();
class Program
private static void DoSomeThing(HongJunGuoTest02 match)
match();
static void Main(string[] args)
DoSomeThing(() => Console.WriteLine("jajaja"));
Console.ReadLine();
函数式编程
匿名方法,Lambda表达式 都是函数式编程思想下的产物,
函数式编程如果从概念角度来理解,比较晦涩,简单来说:
函数式编程的主要特点就是没有变量,所有算法都用递归函数来书写。整个程序除了定义函数就是调用函数,没有其他类型的语句。
这种编程思想的好处和特点,
Lambda 表达式(拉姆达表达式) 和 匿名方法 其实是一件事情。唯一的不同是:他们语法表现形式不同。Lambda 表达式是在语法方面的更进一步的进化。在本质上,他们是一件事情。他们的作用都是:产生方法。即:内联方法。
引用自 C#首席架构师Anders Hejlsberg 的原话:
http://www.ondotnet.com/pub/a/dotnet/2005/10/31/interview-with-anders-hejlsberg-part-2.html?page=2
lambda expressions and anonymous methods are really just two words for the same thing. The only thing that differs is, "What does the syntax look like?" And the lambda expressions are a further evolution of the syntax.But underneath, they do the same thing. They generate methods. You know, they're in-line methods.
所以:我们要了解 Lambda 表达式 就应该同时也了解 匿名方法。下面先看一个简单的代码例子,分别用匿名方法和Lambda 表达式来实现对数组的搜索:
使用 .net 2.0 的匿名方法来搜索字符串数组中包含 a 的字符串数组
static void Main(string[] args)
string[] list = new string[] "abc", "12", "java" ;
string[] ll = Array.FindAll(list,
delegate(string s)
return s.IndexOf("a") >= 0;
);
foreach (string var in ll)
Console.WriteLine(var);
Console.ReadLine();
使用 .net 3.5 的Lambda表达式来搜索字符串数组中包含 a 的字符串数组
static void Main(string[] args)
string[] list = new string[] "abc", "12", "java" ;
string[] ll = Array.FindAll(list, s => (s.IndexOf("a") >= 0));
foreach (string var in ll)
Console.WriteLine(var);
Console.ReadLine();
从上述两个例子我们可以看出:
从代码书写角度,代码可读性角度来说:Lambda表达式 比匿名方法更简单了。
而 Lambda表达式 和 匿名方法都是干的同一件事情,让我们少写一个函数定义。函数的调用和函数的实现在一起完成了。
Lambda表达式的书写格式如下:
(参数列表) => 表达式或者语句块
其中:
参数个数:可以有多个参数,一个参数,或者无参数。
参数类型:可以隐式或者显式定义。
表达式或者语句块:这部分就是我们平常写函数的实现部分(函数体)。
一些Lambda表达式的书写范例:
有两个参数的 Lambda表达式例子:
注:别看比较复杂,LINQ中实际把 下述代码中的 delegate ,DoSomeThing 替你做了,所以你写代码的时候只需要写
var t = DoSomeThing<int>(7, 8, (x, y) => x * y); 这么一行。
public delegate T HongJunGuoTest01<T>(T t1, T t2);
class Program
private static T DoSomeThing<T>(T t1,T t2,HongJunGuoTest01<T> match)
return match(t1, t2);
static void Main(string[] args)
var t = DoSomeThing<int>(7, 8, (x, y) => x * y);
Console.WriteLine(t);
Console.ReadLine();
下面这些写法也是对的(你只需要修改Main函数中的代码,其他地方不需要动):
var t = DoSomeThing<int>(7, 8, (int x, int y) => x * y);
var t = DoSomeThing<string>("7", "8", ( x, y) => x + y);
或者我们写一个更复杂的: => 右边是一段语句块。
var t = DoSomeThing<int>(7, 8, (x, y) => if (x < 5) return (x + 8) * y; else return y; );
最前面的例子是一个参数的例子,我们就不举一个参数的例子了,下面举一个没有参数的例子:
public delegate void HongJunGuoTest02();
class Program
private static void DoSomeThing(HongJunGuoTest02 match)
match();
static void Main(string[] args)
DoSomeThing(() => Console.WriteLine("jajaja"));
Console.ReadLine();
函数式编程
匿名方法,Lambda表达式 都是函数式编程思想下的产物,
函数式编程如果从概念角度来理解,比较晦涩,简单来说:
函数式编程的主要特点就是没有变量,所有算法都用递归函数来书写。整个程序除了定义函数就是调用函数,没有其他类型的语句。
这种编程思想的好处和特点, 参考技术A 数学里边好像有个.
lambda表达式的使用方法
lambda表达式的使用方法
lambda的简要介绍:
在哪里使用lambda表达式:在函数式接口上使用lambda表达式。
使用方法:
我现在有一个需求,读取一个文件的第一行,平时我们定义的方法是直接使用BufferedReader
方法读取数据。
public static String processFile() throws IOException
try (BufferedReader br = new BufferedReader(new FileReader("/Volumes/roczhang/temp/a.txt"));)
return br.readLine();
改造成通用方法
现在我们需要改造一下。使他变成一个通用的读取文件的方法。
我们需要把processFile
的行为参数化。把行为传递给processFile
以便它可以利用BufferedReader
执行不同的行为。
第一步:
首先定义一个参数化的行为(接口)
package java8.demo2_processFile;
import java.io.BufferedReader;
import java.io.IOException;
public interface BufferReaderProcessor
String process(BufferedReader b) throws IOException;
第二步:
然后改造方法,将这个行为通过参数传递给方法,然后使用这个行为来操作BufferedReader
public static String processFile2(BufferReaderProcessor p) throws IOException
try (BufferedReader br = new BufferedReader(new FileReader("/Volumes/roczhang/temp/a.txt"));)
return p.process(br);
第三步:
使用的话配合lambda表达式即可。比如我们想读取两行数据就不用重新定义一个函数了。直接在lambda表达式里面实现即可。对于比较简单的操作可以直接写在lambda表达式里面,太过于复杂代码就不太好读懂了。
String s = processFile2((BufferedReader br) -> br.readLine());
System.out.println("s: " + s);
String s2 = processFile2((BufferedReader br) -> br.readLine() + br.readLine());
System.out.println("s: " + s2);
完整的代码如下。
package java8.demo2_processFile;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class demo
public static void main(String[] args) throws IOException
System.out.println(processFile());
String s = processFile2((BufferedReader br) -> br.readLine());
System.out.println("s: " + s);
String s2 = processFile2((BufferedReader br) -> br.readLine() + br.readLine());
System.out.println("s: " + s2);
public static String processFile() throws IOException
try (BufferedReader br = new BufferedReader(new FileReader("/Volumes/roczhang/temp/a.txt"));)
return br.readLine();
public static String processFile2(BufferReaderProcessor p) throws IOException
try (BufferedReader br = new BufferedReader(new FileReader("/Volumes/roczhang/temp/a.txt"));)
return p.process(br);
以上是关于lambda表达式来自哪里?的主要内容,如果未能解决你的问题,请参考以下文章
Java8学习笔记 - 在哪里可以使用Lambda表达式 + 什么是函数式接口