Java程序员为啥学习Groovy

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java程序员为啥学习Groovy相关的知识,希望对你有一定的参考价值。

正如Groovy对Java很多特性进行的包装优化一样,基于Groovy的HttpBuilder也包裹了HttpClient,使网络编程变得更加的方便易用,下面稍微来用一个例子看一下。
寻找各种依赖的jar包有时候会让我们失去耐心,不过值得庆幸的是我们有Maven和Gradle这样的工具,可以根据配置轻松的帮我们配置好我们需要的数据。下面我们来叙述一下整个过程。
1. 创建文件夹httpbuildertest
2. 创建gradle配置文件,build.gradle,内容如下:
apply plugin: "groovy"
apply plugin: "eclipse"

repositories
mavenCentral()


dependencies
compile "org.codehaus.groovy:http-builder:0.4.0"
compile "org.codehaus.groovy:groovy-all:2.3.3"
testCompile "org.spockframework:spock-core:0.7-groovy-2.0"


gradle我们将做另文介绍
3. 执行gralde eclipse(当然必须先安装gradle),就可以生成eclipse所需要的.classpath和.project文件,这时候就可以使用eclipse导入功能来import->Existing Projects Into WorkSpace。
4. 创建我们的一个测试,试试看是不是可以使用httpbuilder了
import groovyx.net.http.HTTPBuilder
import spock.lang.Specification;
import static groovyx.net.http.Method.*
import static groovyx.net.http.ContentType.*

class HttpbuildLabSpec extends Specification
HTTPBuilder http = new HTTPBuilder( 'http://m.weather.com.cn' )
public void testRequestWeather()
when:
def info =""
http.request( GET, JSON )
url.path = '/data/101290401.html'
headers.'User-Agent' = 'Mozilla/5.0 Ubuntu/8.10 Firefox/3.0.4'
response.success = resp, json ->
info = json.weatherinfo.city

response.failure = resp -> println "Unexpected error: $resp.statusLine.statusCode : $resp.statusLine.reasonPhrase"

then: "曲靖"==info



打完收工,通过这个小例子我们可以了解到这么一些内容:
(1)HTTPBuilder 是这个框架的核心类(要不然怎么和框架一个名字),构建这个类的对象的时候,指定要请求的baseUrl。
(2)request方法可以指定请求的method和返回的数据格式,method对应的是GET/PUT/POST/DELETE/HEAD几个常量,而数据格式目前有JSON/XML/HTML/BINARY/URLENC/ANY几种。
(3)一个比较有意思的地方是,在http的request方法里面,仿佛是无根之水一样突然冒出来了几个没有声明过的变量,看起来连编译也不会通过的方法,那么是如何能正常运作的呢?这个我们就要研究到Groovy的Closure(闭包)。Groovy的闭包里包含有一个delegate属性,一般来说,这个delegate里保存的是闭包使用上下文的对象引用,比如a调用了一个闭包b,则b的delegate就是a的this对象。而在HTTPBuilder对象调用request方法的时候,它把传入闭包的delegate改成了一个叫做SendDelegate的类对象(这是HTTPBuilder的内部类,他们都是用Java写的,在新版的HttpBuilder里,已经改名为RequestConfigDelegate),这个类里面,分别包含了一个叫做getHeaders()的方法,一个叫做getUrL()的方法,一个叫做getResponse()的方法。稍微思索一下我们就可以想到,Groovy里有这样的特性,如果直接使用一个识别不出来的变量,Groovy会假设它是getter的一种简写形式,自动进行补全(当然这也是DSL的常用伎俩,把方法伪装成短语),而getter并没有参数,所以其括号是可以简写的,实际上上面的代码可以写作getUrl().path = '/data/101290401.html',这样就非常符合程序员的视觉体验了。
(4)第四点罗嗦了不少,主要是为了喜欢追根问题的同学释疑,实际上整个调用还是非常的简单明快的,在request闭包里,我们通过response(记得吗,实际上就是GetResponse()),获得了一个Map结构,这个Map的内部结构实际上是Map<String,Closure>,对“success”和“failure”这两个key我们分别设置了对应的闭包,这样就完成了回调的设置,一旦方法成功或者失败,就可以调用到对应的闭包。
(5)使用了JSON作为返回格式,闭包的第二个参数就是解析好的返回body,就是一个Json对象,是可以直接用点号来访问的。当然最好不要在失败的闭包里放这个参数,一般失败的情况比较多,也许就是一个html返回,格式错误那么测试也就无法按照预期进行了。
参考技术A 我 不,我学kotlin。哈哈

机器学习挑战:用 java/groovy 诊断程序(数据挖掘、机器学习)

【中文标题】机器学习挑战:用 java/groovy 诊断程序(数据挖掘、机器学习)【英文标题】:Machine learning challenge: diagnosing program in java/groovy (datamining, machine learning) 【发布时间】:2010-12-22 15:39:18 【问题描述】:

我正计划用 Java 开发程序来提供诊断。数据集分为两部分,一是训练,二是测试。我的程序应该学习从训练数据中进行分类(顺便说一句,其中包含新列中每个问题的 30 个问题的答案,新行中的每条记录最后一列将是诊断 0 或 1,在数据诊断列的测试部分将为空 -数据集包含大约 1000 条记录),然后在测试部分数据中进行预测:/

我从来没有做过类似的事情,所以我会感谢任何关于解决类似问题的建议或信息。

我在考虑Java Machine Learning Library 或Java Data Mining Package,但我不确定这是否是正确的方向......?而且我仍然不确定如何应对这一挑战...

请指教。

一切顺利!

【问题讨论】:

+1:抵消反对票:这似乎是一个有趣的问题。 诊断什么?如果您尝试诊断程序中的问题,则会遇到停止问题。 【参考方案1】:

您的任务是神经网络的经典任务,它首先旨在准确解决分类任务。神经网络在任何语言中的实现都比较简单,是“机器学习”的“主流”,比其他任何语言都更接近人工智能。 您只需实现(或获得现有实现)标准神经网络,例如通过错误反向传播学习的多层网络,并在循环中为其提供学习示例。经过一段时间的学习后,您将在实际示例中使用它。 您可以从这里开始阅读有关神经网络的更多信息: http://en.wikipedia.org/wiki/Neural_network http://en.wikipedia.org/wiki/Artificial_neural_network 您还可以在此处获得许多现成实现的链接: http://en.wikipedia.org/wiki/Neural_network_software

【讨论】:

【参考方案2】:

我强烈建议您使用Weka 完成您的任务 它是一组机器学习算法,具有用户友好的前端,可促进许多不同类型的特征和模型选择策略 您可以使用它来做很多非常复杂的事情,而无需进行任何编码或数学运算 制造商还发布了pretty good textbook,解释了数据挖掘的实际方面 一旦你掌握了它的窍门,你就可以使用它的 API 将它的任何分类器集成到你自己的 java 程序中

【讨论】:

谢谢,我去Weka看看。 该软件和教科书非常适合让您深入了解机器学习,我强烈推荐它们。【参考方案3】:

嗨,正如 Gann Bierner 所说,这是一个分类问题。我所知道的满足您需求的最佳分类算法是 Ross Quinlan 算法。它在概念上很容易理解。

对于分类算法的现成实现,最好的选择是 Weka。 http://www.cs.waikato.ac.nz/ml/weka/。我研究过 Weka 但没有使用,因为我发现它有点太晚了。

我使用了一个更简单的实现,称为 JadTi。它适用于较小的数据集,例如您的数据集。我已经用过很多次了,所以可以自信地说出来。 JadTi 可以在以下位置找到:

http://www.run.montefiore.ulg.ac.be/~francois/software/jaDTi/

说了这么多,您的挑战将是在网络上构建一个可用的界面。为此,数据集的使用将受到限制。数据集基本上是在您已经拥有训练集的前提下工作的,并且您只需一步输入新的测试数据集,您就会立即得到答案。

但我的应用程序,也可能是你的应用程序,是一步一步的用户发现,具有在决策树节点上来回切换的功能。

为了构建这样一个应用程序,我从我的训练集创建了一个 PMML 文档,并构建了一个 Java 引擎,它遍历树的每个节点,要求用户提供输入(文本/收音机/列表)并将值用作输入到下一个可能的节点谓词。

PMML 标准可以在这里找到:http://www.dmg.org/ 这里您只需要 TreeModel。 NetBeans XML Plugin 是用于 PMML 创作的优秀模式感知编辑器。 Altova XML 可以做得更好,但要花费 $$。

也可以使用 RDBMS 来存储您的数据集并自动创建 PMML!我没试过。

祝您的项目好运,如果您需要进一步的意见,请随时告诉我。

【讨论】:

你怎么能如此明确地说决策树是手头任务的最佳算法? 你是对的,对不起。我想我会首先尝试通过 SVM 运行它,因为它很容易快速完成(例如,只需将数据以 libsvm 理解并运行它的格式放置)并且通常相对于数量提供出色的性能你必须做的工作才能让它工作。你可以尝试提升、朴素贝叶斯、(惩罚)逻辑回归(查看带有相关阅读的“glmnet”)......不过,我很难选择一个作为“最好的”。 @srini.venigalla 感谢您的意见!【参考方案4】:

这是一个分类问题,不是真正的数据挖掘。一般的方法是从每个数据实例中提取特征,让分类算法从特征和结果中学习模型(对你来说是 0 或 1)。大概你的 30 个问题中的每一个都有自己的特点。

您可以使用许多分类技术。支持向量机和最大熵一样流行。我没有使用过 Java 机器学习库,但乍一看我没有看到其中任何一个。 OpenNLP 项目具有最大熵实现。 LibSVM 有一个支持向量机实现。几乎可以肯定,您必须将数据修改为图书馆可以理解的内容。

祝你好运!

更新:我同意另一位评论者的观点,即 Russel 和 Norvig 是一本很棒的 AI 书籍,其中讨论了其中的一些内容。如果您对低俗和肮脏的细节感兴趣,Bishop 的“模式识别和机器学习”会深入讨论分类问题。

【讨论】:

谢谢,我有这本书的副本,真的很棒!【参考方案5】:

有多种算法属于“机器学习”类别,哪种算法适合您的情况取决于您处理的数据类型。

如果您的数据基本上由一组问题与一组诊断的映射组成,每个诊断可以是是/否,那么我认为可能有效的方法包括神经网络和自动构建决策树的方法测试数据。

我会看一些标准文本,例如 Russel & Norvig(“人工智能:一种现代方法”)和其他对 AI/机器学习的介绍,看看您是否可以轻松地将他们提到的算法改编为您的特定数据。另请参阅 O'Reilly,“Programming Collective Intelligence”,了解可能适用于您的情况的一种或两种算法的一些示例 Python 代码。

如果你会看西班牙语,墨西哥出版社 Alfaomega 近年来也发表了各种不错的 AI 相关介绍。

【讨论】:

@Neil Coffey - 不懂西班牙语 :( 但我会查看 O'Reilly 的书。谢谢。

以上是关于Java程序员为啥学习Groovy的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们要学习java?

C语言程序设计 为啥要学习C语言

程序员为啥要学深度学习

为啥会出现此错误:无法在初始化程序中访问实例成员'*'。”?

java程序员为啥使用Groovy

java程序员为啥使用Groovy