首页 > OOP语言 > 其它 > 正文

从Groovy到Java 8
2014-02-25 00:00:00   来源:www.bianceng.cn   评论:0 点击:

暂时无描述信息

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";

相关热词搜索:

上一篇:python多线程批量远程管理程序
下一篇:IBM SPSS Modeler Entity Analytics 实例应用分析

分享到: 收藏