函数式编程

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

内容简介:在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循环就好了。

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

查看所有标签

猜你喜欢:

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

Producing Masculinity

Producing Masculinity

Michele White / Routledge / 2019-3 / $39.95

Thoughtful, witty, and illuminating, in this book Michele White explores the ways normative masculinity is associated with computers and the Internet and is a commonly enacted online gender practice. ......一起来看看 《Producing Masculinity》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具