当前位置:首页 > Windows程序 > 正文

(转) 站在C#和JS的角度细谈函数式编程与闭包

2021-03-25 Windows程序

1.函数式编程是什么?

摘自百度的说法是。函数式编程是种编程典范,它将电脑运算视为函数的计算。函数编程语言最重要的基础是 λ 演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。和过程化编程相比,函数式编程里,函数的计算可随时调用。

举个例子。平时如果我们要对集合中的元素进行筛选的话,每次都要写循环,都写这么一大堆代码,麻烦不?

     static void Main(string[] args) { List<int> list = new List<int>() { 1, 2, 3, 4, 5 }; List<int> result1 = new List<int>(); List<int> result2 = new List<int>(); foreach (var item in list) { if (item % 2 == 0) result1.Add(item); } foreach (var item in list) { if (item > 3) result2.Add(item); } }

有没办法构造一个通用的方法?这个方法内部去循环我们要筛选的数组。这样调用方只要指定筛选条件即可。

我们仔细观察下,归纳下它们的共同只处。

1.需要循环

这个很简单,想到循环,我们就应该想到IEnumable

2.筛选条件

我们能不能把筛选元素的这个条件看成一个函数?如

public bool Function(object 当前元素){     //条件     if(当前元素.xx属性>2)//满足条件 return true; else         return false; }

看到这个方法是不是会想到Func<object,bool>?

3.返回结果

这个可以看成把满足条件的元素全部加入到一个集合中,返回回去

知道了这3个条件后,我们大概能构造一个这样的东西

static void Main(string[] args) { List<int> list = new List<int>() { 1, 2, 3, 4, 5 }; var result = MyWhere(list, x => x % 2 == 0); } public static IEnumerable<TInput> MyWhere<TInput>(IEnumerable<TInput> inputlist, Func<TInput, bool> func) { foreach (TInput item in inputlist) { if (func(item)) yield return item; } yield break; }

但我们每次都要传入一个list,感觉好麻烦,是不是能改造成扩展方法?

class Program { static void Main(string[] args) { List<int> list = new List<int>() { 1, 2, 3, 4, 5 }; var result = list.MyWhere(x => x % 2 == 0); } } public static class MyLinq { public static IEnumerable<TInput> MyWhere<TInput>(this IEnumerable<TInput> inputlist, Func<TInput, bool> func) { foreach (TInput item in inputlist) { if (func(item)) yield return item; } yield break; } }

现在是不是爽多了?

我归纳的函数式编程的核心思想是将相同逻辑的部分封装起来。不同逻辑的部分将它封装成一个函数,由调用方来指定这个函数的逻辑

很多人想问了,,JAVA为什么没有类似LINQ这类的扩展方法。。

因为JAVA没有委托这东西,它的思想是完全的面向接口。当然你也可以弄个类似LINQ这类的方法,但用起来会非常变态。首先你要实现定义的某个接口,然后再实现接口里定义的Where方法,这个方法里写你的实现(筛选)逻辑。。这谁会用啊?

如果C#没有匿名委托或lambda。。类似LINQ这类的扩展方法用起来也会很不友好,可以说是变态。

你想想 x=>x.age>5 一句话能搞定,硬要你写个方法。。public bool Find(对象 x){ return x.age>5; }

2.LINQ能移植到JS上吗?

答案是肯定的。可以!函数式编程只是一种思想,只要语言支持匿名方法,玩起来都很爽。

JS是支持匿名函数的,而且是弱类型,所以玩起来非常爽了。

一开始我就在想,有没linq to javascript这东西。结果一搜,果然有=。=

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/67356.html