函数式编程

栏目: 编程语言 · 发布时间: 7年前

内容简介:在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 , 分为三个部分

  1. var greetVar
  2. 类型 String => String
  3. “Hello” + name

一个方法可以赋给一个函数类型的变量 val gr = greet _ ,此处greet是一个方法名。

在该小节中,笔者因为水平和对scala的认识有限,还未能精确描述函数式编程的精髓

  1. 从基本组成和相互关系的角度来描述,面向对象的基本组成是类和对象,基本组成的相互关系是继承、聚合等。函数式编程基本组成是函数、偏函数等,函数与函数关系可以是调用、内嵌、返回等。 当然,面向对象和函数编程是两个维度的东西,对比不太合适。
  2. 笔者学习spark的时候,了解到,你对data set的一系列函数式调用,并不会被立即执行。比如对一个数据集,你先过滤男性、又将值翻番。从执行角度看,不会是把数据拿出来,先for循环一把过滤,再for循环一把每个值乘以2。一系列的函数调用更像是一个执行计划,spark会优化这些计划的执行,最终可能一次for循环就好了。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Foundations of PEAR

Foundations of PEAR

Good, Nathan A./ Kent, Allan / Springer-Verlag New York Inc / 2006-11 / $ 50.84

PEAR, the PHP Extension and Application Repository, is a bountiful resource for any PHP developer. Within its confines lie the tools that you need to do your job more quickly and efficiently. You need......一起来看看 《Foundations of PEAR》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具