从Groovy到Java 8

Groovy开发人员早已熟知Java 8中新引入的概念和新的语言结构了。在Java新版本即将推 出的增强特性中,有很多是Groovy在几年前就已经提供了的。从用于函数式编程风格的新语 法,到lambdas表达式、collection streaming和要把方法引用作为一等公民,Groovy开发人 员在未来编写Java代码时具有先天性优势。本文将重点关注Groovy和Java 8的共同点,并阐 述了Java 8如何解读Groovy中那些熟悉的概念。

我们先来讨论一下函数式编程风格, 目前在Groovy中如何使用函数式编程,Java 8的概念如何提供更好的函数式编程风格。

闭包(Closures)也许是Groovy中最好的函数式编程实例了。从内部结构来看, Groovy中的closure只是一个函数式接口实现。函数式接口是指任意只需要实现一个方法的接 口。默认情况下,Groovy的closure实现了一个名为“Callable”的函数式接口,实现了这个 接口的“call”方法。

def closure = {
       "called"
}
assert closure instanceofjava.util.concurrent.Callable
assert closure() == "called"

通过转换closure的类型,我们可以让Groovy实现其他函数式接口。

public interface Function {
def apply();
}  

def closure = {
        "applied"
} as Function 

assert closure instanceof Function
assert closure.apply() == "applied"

在Java 8中很好地引入了闭包和函数式编程的思想。在Java即将发布的版本中函数 式接口极为重要,因为在Java 8中针对新引入的Lambda函数式接口提供了隐含的实现。

我们可以把Lambda函数当成Groovy中的闭包那样去理解和使用。在Java 8中实现 callable接口像Groovy中的闭包一样简单。

Callable callable = () -> 

"called";
assert callable.call() == "called";

你需要特别注意是,Java 8为单行的lambda函数提供了隐含的返回语句,后来 Groovy也借鉴了这个概念。将来,Groovy也会为单个抽象方法提供隐含实现(类似于Java 8 提供的那些实现)。这个特性使你不必完全派生出closures的具体子类对象就可以使用实例 的属性和方法。

abstract class WebFlowScope {
       private static final Map scopeMap = [:] 

abstractdefgetAttribute(def name); 

publicdef put(key, val) {
scopeMap[key] = val
getAttribute(key)
       }  

protected Map getScope() {
scopeMap
       }
}  

WebFlowScope closure = { name ->
       "edited_${scope[name]}"
} 

assert closure instanceofWebFlowScope
assert closure.put("attribute", "val") == "edited_val"

Java 8针对带有接口默认方法的函数式接口提出了一个类似的概念,即Java的新概 念“接口默认方法”。他们希望借此概念在不违反接口实现规约(在Java之前的版本中建立 的实现规约)的前提下改进核心的API。

当把Lambda函数强制转型为接口时,它们也 可以使用接口的默认方法。也就是说在接口中可以内置健壮的API,使开发人员不必改变类型 的种类或规约就可以使用这些API。

public interface WebFlowScope {
        static final Map scopeMap = new HashMap(); 

        Object getAttribute(Object key); 

default public Object put(Object key, Object val) {
scopeMap.put(key, val);
                return getAttribute(key);
        } 

default Map getScope() {
                return scopeMap;
        }
} 

static final WebFlowScope scope = (Object key) ->
"edited_" + scope.getScope().get(key);
assert scope.put("attribute", "val") == "val";

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, 接口
, 函数
, groovy
, 闭包
, Assert,Java
, closure
, Closures
, callable
Callable接口
java8 groovy、groovy java、groovy java 混编、groovy调用java类、java 动态调用 groovy,以便于您获取更多的相关知识。

时间: 2024-10-02 02:51:06

从Groovy到Java 8的相关文章

《Groovy官方文档》1.3 Groovy和Java比较

原文地址     译文地址  译者:jackWang Groovy语言一直在努力亲近Java开发人员.在设计Groovy语言的时候,我们遵循最小标新立异原则,努力让那些Java开发背景的开发者容易上手并学会.下面我们列举Groovy和Java的一些主要区别. 1 默认导入 下面的包和类是默认导入的,也就是说不必精确使用 import 语句来导入它们: java.io.* java.lang.* java.math.BigDecimal java.math.BigInteger java.net.

Groovy与Java集成常见的坑

groovy特性 Groovy是一门基于JVM的动态语言,同时也是一门面向对象的语言,语法上和Java非常相似.它结合了Python.Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码. Java作为一种通用.静态类型的编译型语言有很多优势,但同样存在一些负担: 重新编译太费工: 静态类型不够灵活,重构起来时间可能比较长: 部署的动静太大: java的语法天然不适用生产dsl: 相对于Java,它在编写代码的灵活性上有非常明显的

Groovy与Java集成常见的坑(转)

groovy特性 Groovy是一门基于JVM的动态语言,同时也是一门面向对象的语言,语法上和Java非常相似.它结合了Python.Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码. Java作为一种通用.静态类型的编译型语言有很多优势,但同样存在一些负担: 重新编译太费工: 静态类型不够灵活,重构起来时间可能比较长: 部署的动静太大: java的语法天然不适用生产dsl: 相对于Java,它在编写代码的灵活性上有非常明显的

了解Groovy、Scala和Clojure如何将行为融入到Java类中

Java 语言的设计有目的地进行了一定的删减,以避免前代产品中已发现的一些问题.例如,Java 语言的设计人员感觉 C++++ 中的多重继承性带来了太多复杂性,所以它们选择不包含该特性.事实上,他们在该语言中很少构建扩展性选项,仅依靠单一继承和接口. 其他语言(包括 Java 下一代语言)存在巨大的扩展潜力.在本期和接下来的两期文章中,我将探索扩展 Java 类而不涉及继承性的途径.在本文中,您会了解如何向现有类添加方法,无论是直接还是通过语法糖 (syntactic sugar). 表达式问题

Java 开发 2.0: 使用 Google App Engine--利用 Groovy、Eclipse 和 JDO 进行快速 Web 应用程序开发

开源解决方案和外来基础设施改变了 Java 开发的特征,使您能够以更低的成本.更快的速度交付更好的软件.Andrew Glover 发明了 Java 开发 2.0 这一术语,使用它概括了所有这些现象体现出来的强大力量.他推出了一个全新的系列,主要介绍有关 Java 开发 2.0 的工具和技术.本系列的第一期文章将宣布 Java 开发 2.0 的到来,并解释了如何使用 Google 的 App Engine for Java 迅速实现这些概念. Java 世界如同一个丰富的生态系统,涉及开发人员.

Groovy一种新兴的Java 2平台语言1.7.6发布

Groovy是一种新兴的 Java 2 平台语言.Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码.Groovy 在 12月16日发布了两个版本,Groovy 1.7.6 是一个 bug 修复版本,而 1.8 Beta3 则包含一些新功能: ● extended command expressions can be used on the right-hand side of assignments ● the @Log AST transformation is cus

groovy v1.7.8发布 一种新兴的Java 2平台语言

Groovy是一种新兴的 Java 2 平台语言.Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码.目前的 Groovy 版本是 1.6.3,在 Java 1.4 和 Java 5 平台上都能使用,也能在 Java 6 上使用. Groovy 是 JVM 的一个替代语言 - 替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同. Groovy界面 ● 是一个基于 Java虚拟机的敏捷 动态语言. ● 构建在

Groovy语法介绍

1. 介绍 Groovy 是基于 JRE 的脚本语言,和Perl,Python等等脚本语言一样,它能以快速简洁的方式来完成一些工作:如访问数据库,编写单元测试用例,快速实现产品原型等等. Groovy 是由James Strachan 和 Bob McWhirter 这两位天才发明的(JSR 241 2004 年 3 月).Groovy 完全以Java API为基础,使用了Java开发人员最熟悉的功能和库.Groovy 的语法近似Java,并吸收了 Ruby 的一些特点,因此 Groovy 在某

使用Groovy开发Android应用

作者:snowdream Email:yanghui1986527#gmail.com QQ 群: 529327615原文地址:https://snowdream.github.io/blog/2016/08/12/android-develop-with-groovy/ 目标 本文旨在引导开发者使用Groovy来开发Android应用. 简介 名词解释 Groovy Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python.Ruby和Smalltalk的许多强大的特性