[Java] 函数式编程相关概念 - 笔记2

createh51个月前 (02-01)技术教程11

匿名函数 ( Anonymous function )

1. 匿名函数,是指没有被绑定到标识符的函数。根据字面意思,也可以理解为没有名字的函数。

2. 匿名函数通常:

1). 作为参数,被传递给高阶函数。

2). 作为高阶函数的返回值。

3. 在函数式编程语言,以及其他拥有头等函数的语言中,匿名函数比较普遍。

4. 在一些编程语言中,匿名函数被关键字 lambda 所标记。所以,匿名函数有也被称为Lambda 表达式 ( Lambda express )。例如,Python 就使用 lambda 进行标记

def h(x):
    return lambda y: x + y

5. 匿名函数是嵌套函数的一种,可以访问外层函数的变量,即其非局部变量。这也意味着,匿名函数需要实现闭包。

6. 匿名函数是一种编程风格。匿名函数从来都不会是解决问题的唯一方式。每一个匿名函数都可以重新定义为有名的函数,并调用该有名函数。

7. 匿名函数除了用于上面提到的高级函数,闭包之外,也常用于柯里化场景。

高阶函数( Higher-order function )

1. 一个函数被称为高阶函数,需要满足至少一个条件

1). 定义一个或多个函数作为自身的参数

2). 返回一个函数作为自身的返回值。

2. 上面 python 例子 h(x) 便是一个高阶函数。C 语言的标准函数 qsort 也是高阶函数。

map

1. map 是一个常见的高阶函数,将给定数据集合的每一个元素,传入给定函数中并进行调用,并返回被调用后的数据集合,元素次序不变。常被称为“apply-to-all”,即全部调用。

2. 下面是一个求平方的 map 应用,用 scheme 来实现。

先定义求平方算法

square x = x * x

然后调用 map

产生的结果为 [1, 4, 9, 16, 25]。

在 Java 8 中,引入了 stream.map(func) 来支持 map 功能。代码如下

        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> squreList = numbers.stream.map(i -> i*i).collect(Collectors.toList);
    
        System.out.println(numbers);    // output : [1, 2, 3, 4, 5]
        System.out.println(squreList);   // output : [1, 4, 9, 16, 25]

柯里化 ( Currying )

1. 柯里化是一种函数转换技术,将一个多参数的函数,转换为一些列只需要单个参数的函数,其中这一系列的函数单参数和之前的多参数一一对应。

function divide(x, y){ 
    return x / y 
}

function divior(d){
    return function(x){ 
        return divide( x, d);
    }
}

var half = divior(2)
var third = divior(3)

half(24)    // return 12
third(24)   // return 8

2. 在数学分析中,有一些分析技术只支持单参数函数,但是实用的函数通常定义多个参数。柯里化就是将多参数函数转化为一些系列的单参数函数。这个技术多用于理论分析,较少应用于工业生产。

头等函数 ( First-class function )

1. 一个编程语言支持头等函数,即意味着把函数作为一等公民,或者说是一等类型。拥有下面几个特性

1). 可以把函数作为参数传递给其他函数

2). 可以把函数作为其他函数的返回值

3). 可以把函数赋值给变量,或者存储到数据结构中。

2. 函数的标示符,就是一个普通的变量,类型为函数类型,没有其他特别状态。

3. 头等函数是函数式编程风格的前提条件,因为函数式编程把高阶函数作为常用的方式。

4. 一个函数可以成为一个变量的值,那么就要判断两个函数是否相等。主要有两种相等。

1). 内涵相等( Intensional equality )。通过对比函数体的源代码,来判断两个函数是否相等。

2). 引用相等( Reference equality )。所有的函数都有一个对应的标识符,通过判断两个函数的标识符是否相等来决定函数本身是否相等。所以,两个分别定义的方法,即使他们的源代码一抹一眼,也会被认为是不相等。大多数语言使用引用相等的方式来判断函数间是否相等。

5. Javascript 基本完整地支持头等函数。

Java 8 引入的闭包,仅仅能获取到不变的非局部变量。Java 里面还没有函数类型。

参考资料

相关文章

什么是Java?(什么是java的关键字)

Java是一种软件平台和计算机编程语言,是现代世界中最普及的技术之一。Java通常用于指Java平台,一组允许轻松进行跨平台应用程序开发的工具以及Java编程语言,Java编程语言是通常用于为此平台开...

Java是什么?Java自学还是培训好?(java有基础自学好还是培训班好)

每年学习Java开发的人都在一直不断上涨,有些人学有所成顺利的迈入了开发的行列,当然也有相当大一部分人由于种种原因没有坚持到最后,那么Java是什么?Java自学还是培训好?下面跟随优就业小编一起来看...

规则引擎-从基本概念到软件实现的详细介绍和说明

上次有人留言让我谈下规则引擎,因此今天整理下我多年前写过的关于规则引擎方面的内容,由于最近自己研究重心没有在规则引擎,因此这篇文章仅仅只做规则引擎常见知识的一个初步普及使用。注:这篇文章是我历史文章重...

Java怎么学?看完这篇文章就知道了

当今,Java编程在日常生活中的运用越来越广泛,相关岗位很有发展前景,因此不少人都想要学习Java。那今天咱们就来聊聊,Java怎么学?这个问题小编非常拿手,下面,我就给大家提供一份详细的Java学...

简单了解下Java中锁的概念和原理(java 锁的是什么)

你好,这里是codetrend专栏“高并发编程基础”。Java提供了很多种锁的接口和实现,通过对各种锁的使用发现理解锁的概念是很重要的。Java的锁通过java代码实现,go语言的锁通过go实现,py...

Java8 新特性全面介绍(java的八大特性)

一、介绍Java 8 已经发布很久了,很多报道表明 Java 8 是一次重大的版本升级,虽然我们的 JDK 环境也升级到1.8,但是在日常的开发过程中,使用最多的编程风格还是停留在 JDK1.7。Ja...