内容简介:在java8 的List 接口中,存在一个default method对应从编程的本质 中 可以知道 程序 = 控制 + 逻辑(这与函数式编程理念是非常契合的)。在这里的sort中,排序是用冒泡还是插入是控制 ,与业务无关。而Comparator 描述的是逻辑,与业务紧密相关。
简介
一些代码技巧
在 java 8 的List 接口中,存在一个default method
void sort(Comparator<? super E> c)
对应 java.util.Collections
中的sort 方法
public static <T> void sort(List<T> list, Comparator<? super T> c) { list.sort(c); }
从编程的本质 中 可以知道 程序 = 控制 + 逻辑(这与函数式编程理念是非常契合的)。在这里的sort中,排序是用冒泡还是插入是控制 ,与业务无关。而Comparator 描述的是逻辑,与业务紧密相关。
在 异步编程——Promise 中作者提了三个接口
interface Callback<R, V> {} // 对输入采取一定的动作,没有返回 public interface Action<V> extends Callback<Void, V> { void call(V value) throws Throwable; } // 将输入转换为输出 public interface Func<R, V> extends Callback<R, V> { R call(V value) throws Throwable; } // 将输入转换为输出,异步 public interface AsyncFunc<R, V> extends Callback<R, V> { Promise<R> call(V value) throws Throwable; }
实现一个完全符合函数式编程理念的项目很难,通常也很少有这样的机会。但在我们日常的代码中,多用用Action、Func、AsyncFunc 这类接口,却可以做到,可以在很大程度上提高代码的可读性。
函数式编程
函数的概念 | 其它 | ||
---|---|---|---|
函数式编程 | 一种东西和另一种东西之间的对应关系。 | 至于什么柯里化、什么数据不可变,都只是外延体现而已。 | |
命令式编程 | 面向过程、面向对象等 | 一个步骤 |
object HelloWorld { def main(args: Array[String]): unit = { args.filter( (arg:String) => arg.startsWith("G") ) .foreach( (arg:String) => Console.println("Found " + arg) ) } }
函数式的代码是“对映射的描述”,查看scala中filter函数的源码,或许更能体会对映射的描述的感觉。
class Array[A]{ // ... def filter (p : (A) => Boolean) : Array[A] = ... // not shown }
当我在说函数也是一个对象时,我在说什么:函数作为参数进行传递、把它们存贮在变量中、或者当作另一个函数的返回值
函数不是方法,方法指的是类或对象中定义的函数, 方法中的this引用会隐性的指向某一对象
。比如 (s:String) => s.toUpperCase()
便是一个函数,它是独立的,没有通过this与一个对象相关联。函数不是方法,但在某些时候,会将方法归入函数。
scala函数中,有偏函数一说,限定了函数的输入。还有柯里化函数,A way to write functions with multiple parameter lists. For instance
def f(x: Int)(y: Int)
is a curried function with two parameter
lists. A curried function is applied by passing several arguments
lists, as in: f(3)(4). However, it is also possible to write a partial
application of a curried function, such as f(3).
比如 "hello world"
可以称为String字面量,那么 (s:String) => s.toUpperCase
可以称为函数字面量。
函数没有副作用,比如没有全局对象被修改。当一个函数采用其它函数作为变量或返回值时,它被称为高阶函数。
函数可以内嵌。
一个方法的极简定义 def id = Match.random
,完整形式 def def():Unit = Match.random
定一个函数类型的值(注意是函数不是方法) var greetVar:String => String = (name) => "Hello" + name
, 分为三个部分
- var greetVar
- 类型 String => String
- “Hello” + name
一个方法可以赋给一个函数类型的变量 val gr = greet _
,此处greet是一个方法名。
在该小节中,笔者因为水平和对scala的认识有限,还未能精确描述函数式编程的精髓
- 从基本组成和相互关系的角度来描述,面向对象的基本组成是类和对象,基本组成的相互关系是继承、聚合等。函数式编程基本组成是函数、偏函数等,函数与函数关系可以是调用、内嵌、返回等。 当然,面向对象和函数编程是两个维度的东西,对比不太合适。
- 笔者学习spark的时候,了解到,你对data set的一系列函数式调用,并不会被立即执行。比如对一个数据集,你先过滤男性、又将值翻番。从执行角度看,不会是把数据拿出来,先for循环一把过滤,再for循环一把每个值乘以2。一系列的函数调用更像是一个执行计划,spark会优化这些计划的执行,最终可能一次for循环就好了。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 函数式编程之数组的函数式编程
- 函数式编程 – 函数式编程如何影响您的编码风格?
- 纯函数:函数式编程入门
- 深入理解 Java 函数式编程,第 1 部分: 函数式编程思想概论
- 思想交融,Android中的函数式编程(2):什么是函数式编程
- 编程范式 —— 函数式编程入门
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
新媒体运营实战技能
张向南 勾俊伟 / 人民邮电出版社 / 2017-5 / 39.80元
《新媒体运营实战技能》共7章。第1章重点介绍了新媒体图片的创意思路及制作技巧,包括微信公众号封面图、信息长图、icon图标、九宫图、gif图片的具体实战操作;第2章重点介绍了创意云文字、微信排版、滑动看图等新媒体文字的排版方法与处理技巧;第3章是新媒体表单,引导读者对表单结构、设计场景及具体应用全面了解;第4章关于H5的创意思路及制作方法,解析了引发H5传播的心理因素,并重点介绍H5的制作工具与具......一起来看看 《新媒体运营实战技能》 这本书的介绍吧!