一种 99%程序员都没用过的 Java 语法

2021-02-05 14:54:26 +08:00
 122006
rt 。

其实就是内插 /模板字符串

很多语言都有的这个功能,而作为业界一大老牌主流语言,JAVA 程序员却只能痛苦地用密密麻麻的加号拼接,丑陋得很
当然,也可以用 String.format,但是大多数情况并不需要特殊格式化,动辄七八个十多个参数,一个个对应起来头都在痛。

更何况,“我可以不用,但不能没有!”

如果我们可以这么写,岂不是美滋滋?

String add = "test2";

assertEquals($("test1 $add"), "test1 test2");

assertEquals($("test1 ${\"Test,mode\".substring(0,6)}${1+2}"), "test1 Test,m3");

---------------------------------------------------------------------------------------------------------------------------------
现在,Java 开发者有了一个新的选择:

Zircon ( https://github.com/122006/Zircon

Zircon 可以让开发者在已有的 java 项目中使用内插字符串。
1 分钟快速配置后,可以和 Groovy 、kotlin 等语言一样快乐地使用美元符进行优雅的字符串拼接,并获得 idea 语法检查及联想功能

使用方法:
使用$()方法包裹字符串
在字符串中,使用${code}以执行 java 代码并插入至原字符串,或使用$变量名以插入至原字符串

优势:
支持 idea 语法检查及方法联想依赖查询等功能(和原生代码完全一致)
无任何依赖库
不需要修改任何原有项目代码,接入即用
支持 Gradle 、Maven 项目,直接 javac 编译.java 文件也支持哦
兼容 Lombok 等语法树替换项目
支持 Android 、JavaWeb 、JavaFx 等开发
几乎不会增加编译时间


为什么还不来试试呢?快快乐乐拼接字符串

JAVA,让摸鱼变得更加快乐~
7764 次点击
所在节点    推广
70 条回复
122006
2021-02-05 18:45:43 +08:00
@arvinsilm 功能上不存在非用不可的情况,只是对 java 中字符串使用的一个优化。语法和其他语言的类似,其实学习成本也不是很高。
多谢支持,让大家写个人项目的时候,能够更快捷直观一点也足够了,毕竟确实解决了我自己一大痛点
meiyoumingzi6
2021-02-05 19:17:09 +08:00
有点像 python 的 f-string
passerbytiny
2021-02-05 19:20:41 +08:00
刷小聪明推广,滚粗。

顺便提一下,Lombok 是用注解替代模板代码(本质上跟切面编程没啥区别),Groovy 、kotlin 是额外套了一套语法(本质上算另一种语言了)。楼主这个,就纯粹是侵入式语法糖,相当于“不习惯英语就让说英语的人去说汉语”。
122006
2021-02-05 19:45:57 +08:00
@passerbytiny 首先标题让你点进来很不好意思,用了上个世纪的推广方式
lombok 不仅仅是代替了 getset 模板方法,其特性中还有诸如 val var 之类的语法糖,和面向切面编程的概念完全不一致
语法糖当然是侵入式,不侵入的语法糖是什么?
至于说汉语的问题,我并不是提出一个倡议一定要怎么做,而是提出了一个可能。
如果对语法糖没有追求的话,那没必要升级 java8,用 7 甚至用 6 不是更好?(当然还有别的好处)
真要争执的话,那转用 kotlin 的岂不是为了不说英语直接撞墙投胎了么?
总而,爱用用,不用的话很抱歉让诸位点进来,毕竟标题确实不对。抱歉
Cbdy
2021-02-05 19:51:28 +08:00
很棒,别出心裁,但是你用了$,那别的也用了$的库就捉急了,我也有个库用了$😳
不知道有什么好的兼容方法
122006
2021-02-05 20:00:34 +08:00
@Cbdy 感谢支持。
其实没影响,当前版本偷懒了,只会分析代码中是$的方法,并对其中的硬编码字符串进行解析,所以其他库的$方法也会进行解析的。只要硬编码字符串中不涉及$的,没有问题的
当然这样的方案确实不 OK,后续版本会通过分析 import 引用,只会拦截我这个方法里的参数
luchong
2021-02-05 20:13:03 +08:00
C#:基本操作!! var str=$"hello,{name}";
Kirsk
2021-02-05 20:17:02 +08:00
表示很反感这种语法 --quote JAVA 程序员却只能痛苦地用密密麻麻的加号拼接 枚举不会 StringBuilder 放着看的? StringJoin 用过吗 没用过是不是可以开喷了
hantsy
2021-02-05 20:50:24 +08:00
@122006 java 15 有 Text block,要什么拼接。
luozic
2021-02-05 20:57:17 +08:00
扩展语法,用法 lombok ;或者模板引擎?
Cbdy
2021-02-05 21:02:55 +08:00
@122006 我也经常需要用 Java 来弄字符串模板,不过我是这么处理的

public static @NotNull String render(@NotNull String template, @NotNull Map<String, ?> scope) {
return Pattern.compile("(\\$\\{(\\w+)})").matcher(template).replaceAll(mr -> requireNonNull(scope.get(mr.group(2)), mr.group(1) + " not found in scope").toString());
}
tamer
2021-02-05 22:55:13 +08:00
兄弟,2021 年了,看看 java 的生态
要是真想搓点新鲜的, 可以选择那几个大框架贡献贡献
闭门造螺丝 还起这个标题真的不多说了
micean
2021-02-05 23:00:08 +08:00
挺好的东西,出来的有点晚,另外字符串模板还需要一个很关键的就是渲染高亮
crclz
2021-02-05 23:34:40 +08:00
C#的东西被各种语言都偷完了
qiezixiansheng
2021-02-06 00:39:07 +08:00
啊,这
dswyzx
2021-02-06 01:01:58 +08:00
我日哦,第一次心疼 javaer
122006
2021-02-06 01:11:43 +08:00
@Kirsk 比如打印日志之类的如果要大量括号之类的格式,括号是很常见的。你打印个日志也写个十多行的 Stringbuilder ?
122006
2021-02-06 01:15:11 +08:00
@micean 可以看看楼里图片或者项目中的图片喔。这是支持内插的代码段渲染高亮的
Kirsk
2021-02-06 01:16:45 +08:00
@122006 你搞笑嘛 可变参数不行?在你眼里只有一个个操作 没看懂再仔细看 不限场景 如果还没懂 麻烦去补下程序如何抽象
Kirsk
2021-02-06 01:18:17 +08:00
@122006 再补充 定义好你要的格式去抽象 也要比这种奇葩实现简单 那你觉得不行 就丢个例子

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/751581

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX