`
lobin
  • 浏览: 425086 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java: 函数式编程

 
阅读更多
写道

 

写道
The symbolic, non-executable form of a method handle's invocation semantics. It consists of a series of names. The first N (N=arity) names are parameters, while any remaining names are temporary values. Each temporary specifies the application of a function to some arguments. The functions are method handles, while the arguments are mixes of constant values and local names. The result of the lambda is defined as one of the names, often the last one.
Here is an approximate grammar:
LambdaForm = "(" ArgName* ")=>{" TempName* Result "}"
ArgName = "a" N ":" T
TempName = "t" N ":" T "=" Function "(" Argument* ");"
Function = ConstantValue
Argument = NameRef | ConstantValue
Result = NameRef | "void"
NameRef = "a" N | "t" N
N = (any whole number)
T = "L" | "I" | "J" | "F" | "D" | "V"

Names are numbered consecutively from left to right starting at zero. (The letters are merely a taste of syntax sugar.) Thus, the first temporary (if any) is always numbered N (where N=arity). Every occurrence of a name reference in an argument list must refer to a name previously defined within the same lambda. A lambda has a void result if and only if its result index is -1. If a temporary has the type "V", it cannot be the subject of a NameRef, even though possesses a number. Note that all reference types are erased to "L", which stands for Object. All subword types (boolean, byte, short, char) are erased to "I" which is int. The other types stand for the usual primitive types.
Function invocation closely follows the static rules of the Java verifier. Arguments and return values must exactly match when their "Name" types are considered. Conversions are allowed only if they do not change the erased type.
L = Object: casts are used freely to convert into and out of reference types
I = int: subword types are forcibly narrowed when passed as arguments (see explicitCastArguments)
J = long: no implicit conversions
F = float: no implicit conversions
D = double: no implicit conversions
V = void: a function result may be void if and only if its Name is of type "V"
Although implicit conversions are not allowed, explicit ones can easily be encoded by using temporary expressions which call type-transformed identity functions.
Examples:
(a0:J)=>{ a0 }
== identity(long)
(a0:I)=>{ t1:V = System.out#println(a0); void }
== System.out#println(int)
(a0:L)=>{ t1:V = System.out#println(a0); a0 }
== identity, with printing side-effect
(a0:L, a1:L)=>{ t2:L = BoundMethodHandle#argument(a0);
t3:L = BoundMethodHandle#target(a0);
t4:L = MethodHandle#invoke(t3, t2, a1); t4 }
== general invoker for unary insertArgument combination
(a0:L, a1:L)=>{ t2:L = FilterMethodHandle#filter(a0);
t3:L = MethodHandle#invoke(t2, a1);
t4:L = FilterMethodHandle#target(a0);
t5:L = MethodHandle#invoke(t4, t3); t5 }
== general invoker for unary filterArgument combination
(a0:L, a1:L)=>{ ...(same as previous example)...
t5:L = MethodHandle#invoke(t4, t3, a1); t5 }
== general invoker for unary/unary foldArgument combination
(a0:L, a1:I)=>{ t2:I = identity(long).asType((int)->long)(a1); t2 }
== invoker for identity method handle which performs i2l
(a0:L, a1:L)=>{ t2:L = BoundMethodHandle#argument(a0);
t3:L = Class#cast(t2,a1); t3 }
== invoker for identity method handle which performs cast



--------------------------------------
lambda term:

a variable, x, is itself a valid lambda term
=> y

CompilerException java.lang.RuntimeException: Unable to resolve symbol: y in this context

=> (def x 1)

=> x
1


1、http://mathworld.wolfram.com/TuringMachine.html

 

 

java函数式编程form表达式形式->:

 

用法:

x -> form

 

上面整个x -> form就是一个form。

 

在其他函数式编程语言中, 其其形式系统一般为:

 

(f & arg*)

 

其form形式有一个括号()。如clojure中打印字符串:

(println "this is a string")

 

还有在其他函数式编程中:

> ((lambda (x y . z) z) 3 4 5 6) 

 

结果输出: 

(5 6)

 

这等同于clojure中:

=> (let [[x y & z] [3 4 5 6]] z)

 

一样的效果,结果输出:

(5 6)

 

clojure中的->和java中的->不一样:

(-> x & forms), 但也完整可以实现java那样的效果。

 

 

 

0
0
分享到:
评论

相关推荐

    java8函数式编程(csdn)————程序.pdf

    Java 8 函数式编程 Java 8 函数式编程是指在 Java 8 中引入的一种新的编程范式,它强加了额外的约束,即所有数据必须是不可变的,设置一次,永不改变。函数式编程将值传递给函数,该函数然后生成新值但从不修改...

    Java-Java函数式编程教程

    Java函数式编程是一种编程范式,它强调使用函数作为程序的基本构建块,将计算视为函数的组合,并且尽可能避免改变状态和可变数据。在Java 8及更高版本中,函数式编程得到了官方的大力支持,引入了Lambda表达式、...

    Java 8函数式编程.pdf

    Java 8函数式编程

    Java8 Lambdas 函数式编程百度网盘

    Java8 函数式编程百度网盘共享,Java8 函数式编程百度网盘,Java8 百度网盘,Java8 函数式编程 PDF 开源资源, Java8 Lambdas 表达式百度网盘,Java8 Lambdas 百度网盘, 象征性的给一分意思意思

    《Java函数式编程》_高清华.zip

    Java函数式编程是一种将函数作为一等公民的编程范式,它强调使用函数来构造程序,减少副作用,提高代码的可读性和可维护性。在Java 8及更高版本中,函数式编程得到了显著增强,引入了Lambda表达式、函数接口、Stream...

    Scala函数式编程

    函数式编程(FP)是一种软件开发风格,它注重不依赖于编程状态的函数。函数式代码易于测试和复用,容易实现并发,且不容易受到bug的攻击。Scala是一种能很好支持函数式编程的新兴JVM语言。《Scala函数式编程》是针对...

    读书笔记:函数式编程 scala,java8,groovy 学习.zip

    读书笔记:函数式编程 scala,java8,groovy 学习

    黑马程序员Java函数式编程全套视频教程,Lambda表达式、Stream流、函数式编程一套全通关1

    Java函数式编程是一种高效、简洁的编程范式,它在Java 8中得到了全面支持,大大改变了Java开发人员编写代码的方式。本套黑马程序员的Java函数式编程视频教程涵盖了Lambda表达式、Stream流以及函数式编程的核心概念,...

    Java 8函数式编程.rar

    Java 8是一个重要的Java语言版本,它引入了对函数式编程的支持,极大地提升了代码的简洁性和可读性,特别是对于集合操作。函数式编程是一种编程范式,它将计算视为函数的组合,而不是状态的改变或控制流程。在Java 8...

    java 8 函数式编程 (源码)

    Java 8 是一个重要的Java版本,它引入了函数式编程的概念,极大地扩展了语言的功能,使得Java开发者可以采用更加简洁、高效的方式来编写代码。Richard Warburton 的《java 8 函数式编程》是一本深入解析这一主题的...

    面向Java开发者的函数式编程

    面向Java开发者的函数式编程是一种将函数式编程思想应用于Java开发中的实践方法。函数式编程是一种编程范式,强调程序数据的不可变性、避免副作用,并利用纯函数来构造软件。这种编程风格在处理复杂性、提高代码...

    Clojure脚本:函数式编程的现代演绎

    Clojure是一种运行在Java虚拟机(JVM)上的动态函数式编程语言,它属于Lisp家族。Clojure的设计哲学强调了函数作为一等公民的地位,以及数据的不可变性,这些特性使得Clojure在处理并发编程和数据密集型应用时表现...

    java lambda函数式编程完成实例代码

    Java Lambda 函数式编程是Java 8引入的一项重要特性,它极大地简化了处理函数对象的方式,使得代码更加简洁、易读。Lambda表达式是函数式编程的核心,它允许我们将函数作为一个参数传递,或者将函数作为返回值。在这...

    javascript函数式编程

    通过阅读《JavaScript函数式编程指南》,读者可以了解到函数式编程的基本概念和实现技巧,并且会发现JavaScript作为函数式编程语言的适用性。 函数式编程指南通常会涵盖以下几个重要知识点: 一等公民的函数:在...

    Java 8新特性之Lambda与函数式编程.pdf

    在Java 8之前,重用通常依赖于对象和类型系统,但Java 8通过函数式编程引入了另一种重用机制,即通过函数实现代码重用。函数可以作为参数传递,也可以是函数的返回值,或者在函数中创建另一个函数,从而进一步提高...

    Kotlin Lambda 表达式:函数式编程的瑞士军刀

    4. **函数式编程**:支持函数式编程范式,提供了 Lambda 表达式等特性。 5. **扩展性**:Kotlin 允许扩展现有类的功能。 6. **协程**:Kotlin 支持协程,这使得编写异步代码更加简洁。 7. **空安全**:Kotlin 的空...

    java函数式编程

    Java函数式编程是一种编程范式,它将计算视为数据处理,并强调程序的数据流和变换,而不是对指令进行控制。在Java 8及更高版本中,函数式编程得到了强大的支持,引入了Lambda表达式、Stream API以及函数式接口等概念...

    Java 8函数式编程 范例

    Java 8是Java语言的一个重要版本,引入了大量新特性,其中最具革命性的就是函数式编程的支持。函数式编程在Java 8中的实现主要体现在Lambda表达式、Stream API以及方法引用等方面,这些新特性极大地提高了代码的简洁...

    读书笔记:Java 函数式编程.zip

    读书笔记:Java 函数式编程

Global site tag (gtag.js) - Google Analytics