java和scala代码可以混合编写吗_Scala字符串插值的妙用,以及java+scala混合编程
一
我们在项目中遇到一个需求,输入为json字符串,如:
{
"title": "lrtest",
"alg": "LogisticRegression",
"params": {
"inputTable": "xxx.lrtest3",
"labelColumn": "label",
"featureColumns": [
{"columnName":"f0","columnType":"Double"},
..
{"columnName":"f5","columnType":"Double"}
],
"elasticNetParam": 1.0,
"fitIntercept": true,
"maxIter": 10,
..
"fraction": 0.8,
}
}
输出为该机器学习算法执行的scala代码,如:
..
val lor = new LogisticRegression()
.setFeaturesCol("features")
.setLabelCol("indexedLabel")
.setRegParam(params.regParam)
.setElasticNetParam(params.elasticNetParam)
.setMaxIter(params.maxIter)
.setTol(params.tol)
.setFitIntercept(params.fitIntercept)
..
本质上需要的是一个json到scala的编译器。最早的时候使用纯java编程,解决方法是先写好模板化的代码,其中的参数如MaxIter这种在模板代码中写为${maxIter},然后根据json串解析到的参数,通过String.replace()模板代码以生成最终代码。过程如下:
模板代码:
val lr = new LogisticRegression()
.setFeaturesCol("features")
.setLabelCol("label")
.setWeightCol("weight")
.setElasticNetParam({elasticNetParam})
.setFitIntercept({fitIntercept})
.setMaxIter({maxIter})
.setRegParam({regParam})
.setStandardization({standardization})
.setThreshold({threshold})
.setTol({tol})
replace的过程就不贴了,简单来说就是先从文件中将模板代码读取出来,然后将占位符replace实际json串的参数,脑补下好了,代码删掉了,懒得去翻git了。
这样的坏处是什么呢?
第一,由于是模板代码,决定了这个过程非常不灵活。假如有个参数是可选的,不需要在new LogisticRegression()的时候set进去,模板代码不能很自然的搞定;
第二,可维护性比较差,因为模板跟replace的过程的割裂的,互相没有约束,很难在replace的代码段中清楚的看到有没有漏replace的占位符。
第三,每次请求都要从文件中读取模板代码,性能比较差。
第四,由于java中多行字符串只能使用 “string1 “ + “string2”这种形式来编写,并且如果字符串中有引号还需要加斜杠转义,造成如果想将代码拷贝出去运行的话需要做一系列的修改。
使用scala的字符串插值就可以很简单的解决这个问题。
//todo: 什么是scala 字符串插值,请google
还是上面的例子:
val params: LogisticRegressionBody = JsonProc.toObj(jsonStr, classOf[LogisticRegressionBody])
val createMethod =
s"""
val method = new LogisticRegression()
.setFeaturesCol("features")
.setLabelCol("label")
.setElasticNetParam(${params.getElasticNetParam})
.setFitIntercept(${params.getFitIntercept})
.setMaxIter(${params.getMaxIter})
.setRegParam(${params.getRegParam})
.setStandardization(${params.getStandardization})
.setThreshold(${params.getThreshold})
.setTol(${params.getTol})
"""
params即为json解析得到的body,字符串插值可以很灵活的将json的值“插”到模板代码中,并且scala支持多行字符串,可读性比较高。
二
由于有些问题使用java来解决比较熟悉,所以这个工程是java和scala混合的,其pom.xml需要注意下。下面贴spring boot框架和scala代码混合编程的maven工程。这种写法maven会mix方式的编译java和scala代码,即使2个子包有相互依赖也没问题。
maven还可以配置javaBeforeScala或者反过来,不过我觉得意义不大,不如mix以不变应万变。官方说明等后面找到了再贴一下链接。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.ieevee
ml
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
1.4.1.RELEASE
2.10.5
1.7
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-aop
org.scala-lang
scala-library
${scala.version}
org.scala-lang
scala-compiler
${scala.version}
...
org.springframework.boot
spring-boot-maven-plugin
net.alchim31.maven
scala-maven-plugin
3.2.1
scala-compile-first
process-resources
add-source
compile
scala-test-compile
process-test-resources
testCompile
spring-releases
https://repo.spring.io/libs-release
spring-releases
https://repo.spring.io/libs-release
纯记录,凌乱请见谅。
java和scala代码可以混合编写吗_Scala字符串插值的妙用,以及java+scala混合编程相关推荐
- idea Error:(1, 10) java: 需要class, interface或enum, 未结束的字符串文字,Error:(55, 136) java: 非法字符: \65533...
1.未结束的字符串文字,Error:(55, 136) java: 非法字符: \65533 这些乱七吧八遭的错误如果很多的话 , 尝试 重新修改下生成目录 修改下语言等级 上述方法都不行 ,还报错 ...
- java EE crm代码_基于jsp的小型企业CRM-JavaEE实现小型企业CRM - java项目源码
基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的小型企业CRM, 该项目可用各类java课程设计大作业中, 小型企业CRM的系统架构分为前后台两部分, 最终实现在 ...
- java教师工作量代码,基于jsp的教师工作量管理系统-JavaEE实现教师工作量管理系统 - java项目源码...
基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的教师工作量管理系统, 该项目可用各类java课程设计大作业中, 教师工作量管理系统的系统架构分为前后台两部分, 最 ...
- java和scala代码可以混合编写吗_IDEA实现Java与Scala代码混合开发
文章目录 0x00 文章内容 0x01 编写Scala代码 1. 引入Scala的SDK 2. 运行结果 0x02 解决两个问题 1. 引入Scala插件 2. 排除依赖 0xFF 总结 0x00 文 ...
- java调用javafx_Java代码调用JavaFX的例子(大力推荐)
在JavaFX 1.0发布之后,本人撰写的文章JavaFX和Java之间的互操作性被各网站转载.文中总结了3种从Java调用JavaFX的方法.这三种方法分别为: http://www.javafxb ...
- java 运行scala_使用java命令运行scala代码
Scala是运行在JVM上的语言,跑在标准的Java平台上,可以与所有的Java库实现无缝交互. 下面运行一个小程序来看看在JVM上如何使用java命令来运行Scala程序. 在编写代码之前,我们首先 ...
- 表示我想你的代码java_如何编写可怕的Java代码?
我决定告诉你如何编写可怕的Java代码.如果你厌倦了所有这些美丽的设计模式和最佳实践,并且想写些疯狂的东西,请继续阅读. 如果你正在寻找有关如何编写良好代码的建议,请查看其它文章! 对一切使用异常 你 ...
- java fragment_初步认识Fragment 之一 编写简单的fragment代码
今天初步学习到了Fragment ,如果说activity是一堵墙, 那么它类似于一个便利贴,能将内容写在上面粘贴到任意一面墙上, 而不需要每一堵墙上都写满相同的内容 , 下面我们来了解 怎样编写 F ...
- 应用FileInputStream类,编写应用程序,从磁盘上读取一个Java程序,并将源程序代码显示在屏幕上
应用FileInputStream类,编写应用程序,从磁盘上读取一个Java程序,并将源程序代码显示在屏幕上. package p1;import java.io.*; public class FI ...
最新文章
- python爬虫之User Agent
- Android10.0 开机广播BOOT_COMPLETED发送流程分析
- [导入]silverlight 2.0希伯来语及阿拉伯语的support.zip(344.42 KB)
- stm31.js使用详解(网页魔法菜单)
- 刷脸支付弊端举例_刷脸支付的优势和弊端,你都知道?
- mysql 代码怎么优化_MySQL 性能优化的简略办法
- 一个批量转换文件编码的python脚本
- HoloLens 2开发:使用Gaze开发,视线小球不停向眼端移动
- 0-1背包(动态规划)
- ghs文件可以删除吗_电脑C盘快满了,哪些文件可以直接删除掉?带你了解一下...
- 不登录复制 CSDN代码
- 纯C语言编程-游戏之弹跳球
- 软考软件设计师下午真题-面向对象的程序设计与实现-访问者设计模式(2015年上半年试题六)Java代码讲解
- ueditor插入视频无法播放解决方法
- 转载:虚拟机安装centos6.5出现 unsupported hardware detected 解决方法
- 这次,在人工智能面前,人类输得一败涂地
- Java学习——类和对象(上)
- 士兵杀敌(coduck)
- Lawnmower(洛谷 CF115B)
- 栈的基础与基本操作实现