我们在项目中遇到一个需求,输入为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混合编程相关推荐

  1. idea Error:(1, 10) java: 需要class, interface或enum, 未结束的字符串文字,Error:(55, 136) java: 非法字符: \65533...

    1.未结束的字符串文字,Error:(55, 136) java: 非法字符: \65533  这些乱七吧八遭的错误如果很多的话 , 尝试 重新修改下生成目录 修改下语言等级 上述方法都不行 ,还报错 ...

  2. java EE crm代码_基于jsp的小型企业CRM-JavaEE实现小型企业CRM - java项目源码

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的小型企业CRM, 该项目可用各类java课程设计大作业中, 小型企业CRM的系统架构分为前后台两部分, 最终实现在 ...

  3. java教师工作量代码,基于jsp的教师工作量管理系统-JavaEE实现教师工作量管理系统 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的教师工作量管理系统, 该项目可用各类java课程设计大作业中, 教师工作量管理系统的系统架构分为前后台两部分, 最 ...

  4. java和scala代码可以混合编写吗_IDEA实现Java与Scala代码混合开发

    文章目录 0x00 文章内容 0x01 编写Scala代码 1. 引入Scala的SDK 2. 运行结果 0x02 解决两个问题 1. 引入Scala插件 2. 排除依赖 0xFF 总结 0x00 文 ...

  5. java调用javafx_Java代码调用JavaFX的例子(大力推荐)

    在JavaFX 1.0发布之后,本人撰写的文章JavaFX和Java之间的互操作性被各网站转载.文中总结了3种从Java调用JavaFX的方法.这三种方法分别为: http://www.javafxb ...

  6. java 运行scala_使用java命令运行scala代码

    Scala是运行在JVM上的语言,跑在标准的Java平台上,可以与所有的Java库实现无缝交互. 下面运行一个小程序来看看在JVM上如何使用java命令来运行Scala程序. 在编写代码之前,我们首先 ...

  7. 表示我想你的代码java_如何编写可怕的Java代码?

    我决定告诉你如何编写可怕的Java代码.如果你厌倦了所有这些美丽的设计模式和最佳实践,并且想写些疯狂的东西,请继续阅读. 如果你正在寻找有关如何编写良好代码的建议,请查看其它文章! 对一切使用异常 你 ...

  8. java fragment_初步认识Fragment 之一 编写简单的fragment代码

    今天初步学习到了Fragment ,如果说activity是一堵墙, 那么它类似于一个便利贴,能将内容写在上面粘贴到任意一面墙上, 而不需要每一堵墙上都写满相同的内容 , 下面我们来了解 怎样编写 F ...

  9. 应用FileInputStream类,编写应用程序,从磁盘上读取一个Java程序,并将源程序代码显示在屏幕上

    应用FileInputStream类,编写应用程序,从磁盘上读取一个Java程序,并将源程序代码显示在屏幕上. package p1;import java.io.*; public class FI ...

最新文章

  1. python爬虫之User Agent
  2. Android10.0 开机广播BOOT_COMPLETED发送流程分析
  3. [导入]silverlight 2.0希伯来语及阿拉伯语的support.zip(344.42 KB)
  4. stm31.js使用详解(网页魔法菜单)
  5. 刷脸支付弊端举例_刷脸支付的优势和弊端,你都知道?
  6. mysql 代码怎么优化_MySQL 性能优化的简略办法
  7. 一个批量转换文件编码的python脚本
  8. HoloLens 2开发:使用Gaze开发,视线小球不停向眼端移动
  9. 0-1背包(动态规划)
  10. ghs文件可以删除吗_电脑C盘快满了,哪些文件可以直接删除掉?带你了解一下...
  11. 不登录复制 CSDN代码
  12. 纯C语言编程-游戏之弹跳球
  13. 软考软件设计师下午真题-面向对象的程序设计与实现-访问者设计模式(2015年上半年试题六)Java代码讲解
  14. ueditor插入视频无法播放解决方法
  15. 转载:虚拟机安装centos6.5出现 unsupported hardware detected 解决方法
  16. 这次,在人工智能面前,人类输得一败涂地
  17. Java学习——类和对象(上)
  18. 士兵杀敌(coduck)
  19. Lawnmower(洛谷 CF115B)
  20. 栈的基础与基本操作实现

热门文章

  1. 计算机软件系统发展历史,一文带你了解操作系统发展史
  2. Linux系统的grub.cfg文件损坏修复
  3. springboot状态机模式
  4. 加强版Apktool堪称逆向神器
  5. 删除AWS绑定的信用卡账户
  6. 十六. 项目干系人管理
  7. 第四章 DirectX 渲染流水线(上)
  8. AngularJS 控制器中处理DOM事件
  9. Go语言并发安全与锁
  10. 网关末尾要么是1要么是254