今天和一个后台程序员讨论时,听他说”java新版本用了很多js特性,现在java不会lambda表达式编程感觉自己很low”。
一开始并没太在意这句话,只是觉得语言的改进难免会吸收一些有益于开发效率或体验的特性罢了。随后在python cookbook中第1.2节关于解构任意长度可迭代对象的discuss看到一句话:
Oftentimes, these iterables have some known component or pattern in their construction (e.g. “everything after element 1 is a phone number”), and star un‐ packing lets the developer leverage those patterns easily instead of performing acro‐ batics to get at the relevant elements in the iterable
大意是,由于可迭代对象的结构或模式往往是已知的,当我们想将一个可迭代对象中的元素解构赋值给一系列变量的时候,我们可以借助*符号通过既定的模式进行解构赋值,比如:
//以下phone_numbers是一个列表存储若干个电话
>>> record = ('Dave', 'dave@example.com', '773-555-1212', '847-555-1212')
>>> name, email, *phone_numbers = user_record
>>> phone_numbers
['773-555-1212', '847-555-1212']
突然发觉,其实这种对模式的利用贯穿我们编程的各个层面,包括但不限于下面几种:
文本模式:我们日常用的的正则,校验用户名、密码、身份证或车牌号等
语法模式:不同的编程语言总会在语法层面上有一些相似/相同的模式,如lambda(匿名函数)、三目运算符
数据组织的模式:结构,如哈希表、数组、链表等;成分:数组元素都为同一类型,或不同类型的有序排列
处理数据的一般步骤:filter->map->reduce
设计模式:常见的观察者、继承、策略等实现特定场景下的代码复用和解耦
不管使用什么语言,做工程开发还是底层工具,我们总可以利用一些自己熟知的模式去解决问题,或者在某些特定的架构/模式下,知道自己可以做什么,或怎么做才合理。
lambda看起来只是语言层面上提供给我们的一种便利(现在越来越多语言支持它),但基于我以前的前端经历,它是一种有用的工具,至少在动态语言中越发常用:
-在函数中创建匿名函数并返回给外界,作为闭包使用,以保护私密数据
-作为策略依据传给各种高阶函数,如ES5之后的各种数组方法(filter、sort)的参数
-作为函数式编程中数据映射的中间载体,如:
const multip = (factor)=>(num)=>factor*num
const multip3 = multip(3)
multip3(5) //15
想了想,发现这个命题可以变得很泛呢。。算了算了,当作杂记吧