以前写过一篇java8的流操作,人们都说流操作是函数式编程,但函数式编程是什么呢? 什么是函数式编程?它是一种编程范式,即一切都是数学函数。函数式编程语言里也可以有对象,但通常这些对象都是恒定不变的 —— 要么是函数参数,要什么是函数返回值。函数式编程语言里没有 for/next 循环,因为这些逻辑意味着有状态的改变。相替代的是,这种循环逻辑在函数式编程语言里是通过递归、把函数当成参数传递的方式实现的。 函数式编程单看上面的理论无疑是无法理解的,所以,需要通过它的一些特点来感受什么是函数式编程 函数是”第一等公民” 所谓 第一等公民(first class),指的是函数与其他数据类型一样,处于平等地位, 只用”表达式”,不用”语句” “表达式”(expression)是一个单纯的运算过程,总是有返回值;”语句”(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说, 原因是 当然,实际应用中,不做I/O是不可能的。因此,编程过程中,函数式编程只要求把I/O限制到最小,不要有不必要的读写行为,保持计算过程的单纯性。 没有”副作用” 所谓副作用(side effect),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。 函数式编程强调没有”副作用”,意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为, 不修改状态 上一点已经提到,函数式编程只是返回新的值, 在其他类型的语言中,变量往往用来保存”状态”(state)。不修改变量,意味着状态不能保存在变量中。函数式编程使用参数保存状态,最好的例子就是递归。 引用透明 引用透明(Referential transparency),指的是函数的运行不依赖于外部变量或”状态”,只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的。 OO(object oriented,面向对象)是抽象数据,FP(functional programming,函数式编程)是抽象行为。 在java中,函数式编程是通过 基本表达形式如下: Lambda 表达式的基本语法是: JDK 8 中提供了大量的函数接口,这些接口定义在 以下是基本命名准则: 下表描述了 java.util.function 中的目标类型(包括例外情况): Supplier BooleanSupplier IntSupplier LongSupplier DoubleSupplier IntConsumer LongConsumer DoubleConsumer Function IntFunction DoubleFunction ToIntFunction IntToLongFunction IntToDoubleFunction LongToIntFunction LongToDoubleFunction DoubleToIntFunction DoubleToLongFunction IntUnaryOperator LongUnaryOperator DoubleUnaryOperator IntBinaryOperator LongBinaryOperator DoubleBinaryOperator IntPredicate LongPredicate DoublePredicate IntToLongFunction IntToDoubleFunction LongToIntFunction LongToDoubleFunction DoubleToIntFunction DoubleToLongFunction 其中最常用的是: 接下来实际的看看如何使用这些接口 学到这里才突然发现,虽然以前完全不知道函数接口这个东西,但实际上却已经在使用他了,比如 虽然在宣传中,函数式编程有着巨大的优势,比如适合 关于函数式编程能高效创建更健壮的代码这一观点仍存在部分争议。虽然已有一些好的范例,但还不足以证明纯函数式语言就是解决编程问题的最佳方法。 不管怎样,多学一学总是好的什么是函数式编程
可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。
举例来说,下面代码中的print变量就是一个函数,可以作为另一个函数的参数。每一步都是单纯的运算,而且都有返回值。
函数式编程的开发动机,一开始就是为了处理运算(computation),不考虑系统的读写(I/O)。
“语句”属于对系统的读写操作,所以就被排斥在外。尤其是不得修改外部变量的值.
有不少朋友问,如何深入学习Java后端技术栈,今天一个,互联网牛人整理出来的Java深入学习路线图,以及开发工具包,【戳我进入】学习裙。不修改系统变量
。因此,不修改变量,也是它的一个重要特点。lambda表达式
实现的。lambad表达式
Runnable noArguments = () -> System.out.println("Hello World");
-> ->
()
。 然而,这是一个特例。()
包裹参数。 为了保持一致性,也可以使用括号 ()
包裹单个参数,虽然这种情况并不常见。()
表示空参数列表。()
中。{}
,并根据情况看是否需要 return
Lambda 表达式产生函数,而不是类。 在 JVM(Java Virtual Machine,Java 虚拟机)上,一切都是一个类,因此在幕后执行各种操作使 Lambda 看起来像函数 —— 但作为程序员,你可以高兴地假装它们“只是函数”。
函数接口
/** 强制 javac 检查一个接口是否符合函数接口的标准。如果该注释添加给一个枚举类型、类或另一个注释,或者接口包含不止一个抽象方法,javac 就会报错 **/ @FunctionalInterface //该注解不是必选项 interface Yunzhi { //只包含一个抽象方法,称为函数式方法。 String test(String s); } public class LambdaExpressions { static Yunzhi yunzhi = x ->"this is a" + x ; public static void main(String[] args) { System.out.println(yunzhi.test("test")); } }
yunzhi
实际上是实现了 Yunzhi
的 test()
,类似上面的这种接口叫函数式接口。java.util.function
中,因此我们一般情况下不需再定义自己的接口,同时,各个接口的作用和名字都是相对应的,所以,了解函数式接口的命名模式就是很有必要的了。
Function
, Consumer
, Predicate
等。参数类型通过泛型添加。LongConsumer
, DoubleFunction
, IntPredicate
等,但基本 Supplier
类型例外。To
表示,如 ToLongFunction <T>
和 IntToLongFunction
。UnaryOperator
,两个参数使用 BinaryOperator
。Bi
。
特征
数式方法名
示例
无参数;
无返回值Runnable (java.lang)
run()
Runnable
无参数;
返回类型任意Supplier
get()
getAs类型()
<T>
无参数;
返回类型任意Callable (java.util.concurrent)
call()
Callable
<V>
1 参数;
无返回值Consumer
accept()
Consumer<T>
2 参数 Consumer
BiConsumer
accept()
BiConsumer<T,U>
2 参数 Consumer ;
1 引用;
1 基本类型Obj类型Consumer
accept()
ObjIntConsumer<T>
ObjLongConsumer<T>
ObjDoubleConsumer<T>
1 参数;
返回类型不同Function
apply()
To类型 和 类型To类型 applyAs类型()
<T,R>
<R>
LongFunction<R>
<R>
<T>
ToLongFunction<T>
ToDoubleFunction<T>
1 参数;
返回类型相同UnaryOperator
apply()
UnaryOperator<T>
2 参数类型相同;
返回类型相同BinaryOperator
apply()
BinaryOperator<T>
2 参数类型相同;
返回整型Comparator
(java.util) compare()
Comparator<T>
2 参数;
返回布尔型Predicate
test()
Predicate<T>
BiPredicate<T,U>
参数基本类型;
返回基本类型类型To类型Function
applyAs类型()
2 参数类型不同
Bi操作 (不同方法名)
BiFunction<T,U,R>
BiConsumer<T,U>
BiPredicate<T,U>
ToIntBiFunction<T,U>
ToLongBiFunction<T,U>
ToDoubleBiFunction<T>
class Foo {} class Bar { Foo f; Bar(Foo f) { this.f = f; } } public class FunctionVariants { static Function<Foo, Bar> f1 = f -> new Bar(f); public static void main(String[] args) { Bar b = f1.apply(new Foo()); } }
Comparator
广泛的运用在各种比较当中, pridect
也在spring的综合查询中使用过了。关于函数式编程的争议
并行编程
、 代码可靠性
和 代码创建和库复用
,但在某些大佬看来:
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算