跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 一种 99%程序员都没用过的 Java 语法
未分類
8 2 月 2021

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

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

資深大佬 : 122006 2

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,让摸鱼变得更加快乐~

大佬有話說 (69)

  • 主 資深大佬 : 122006

    讲道理,虽然应该都是被标题骗进来的,但是应该都不亏吧。
    觉得这个项目做得可以欢迎给个 star 哦

  • 資深大佬 : handle233

    这是不是该放在推广节点?

  • 資深大佬 : chendy

    我第一反应是 label break
    结果是推广自己的项目,啊这,应该发推广节点吧

  • 資深大佬 : Kasumi20

    我选择换到 Kotlin

  • 資深大佬 : YouLMAO

    不能发推广,应该直接扔垃圾箱,为了写个字符串,串改这么多,

  • 資深大佬 : Rwing

    考虑一下 C# ?

  • 資深大佬 : dqzcwxb

    没用过 MessageFormat.format()是吧?

  • 資深大佬 : AndyAO

    很好的项目

    Java 在语法方面确实很保守

    很多功能需要靠别的项目来实现

    虽然这样降低了效率,但是对于协同工作来说,还是有点优势的,因为语法简单读起来就更容易

    Go 好像也是这种设计思路,语法上的特性,给的比其他的新型语言要少得多

  • 資深大佬 : hehe12980

    这玩意不就是 Groovy 里的语法么 通常 def a = ‘love’, def b = “${a} you” , 不过 java 拼字符 确实鸡儿类累

  • 主 資深大佬 : 122006

    @Kasumi20 老项目切换 kotlin 还是不可能的,java 目前还是主流。这个更多是一个小插件,进行一个小的功能的优化

  • 主 資深大佬 : 122006

    @hehe12980 没错,就是用的 Groovy 的语法(也是选择 Groovy 作为 Language Injection 的语言),甚至 Kotlin 也有类似的。
    大家都有,java 有一个也不过分吧~

  • 主 資深大佬 : 122006

    @AndyAO 感谢支持,

    直接切换新语言步子跨度太大,门槛更高,使用这种小功能插件并不会影响可读性,正常写法也完全兼容,别人看到也能够理解。

    同理,lombok 这么香的原因

    更何况是 java 拼字符串实在是一言难尽,而且还很常用。看到一堆加号有点脑袋疼

  • 主 資深大佬 : 122006

    @dqzcwxb 和 String.format()区别不大。你点进去看看就知道了,这个项目完全是两码事

  • 資深大佬 : lllllliu

    let a = “Java”
    let b = “Script”
    let str = `${a}${b}`

  • 資深大佬 : mightofcode

    我被骗了
    我草泥马

  • 資深大佬 : learningman

    又不是语言内建支持,有啥用

  • 主 資深大佬 : 122006

    @mightofcode 这位喷子,你在 java 里面用过么?

  • 資深大佬 : weizhen199

    当年 c#过来写 java 确实这点很难受,还特意自己做了个库

  • 資深大佬 : 75er

    .neter 摸了摸自己的胡子 这不是基础语法吗?

  • 主 資深大佬 : 122006

    @75er 不好意思,应该在标题中强调在 java 中使用的语法的

  • 資深大佬 : bugmakerxs

    这,不是 springEl 么

  • 資深大佬 : sadfQED2

    哈哈,java 也开始抄袭我大 php 了,

    php 果然是世界上最好的语言

  • 主 資深大佬 : 122006

    @learningman 引入依赖之后,用起来也和语言本身特性区别不大

  • 主 資深大佬 : 122006

    @bugmakerxs 类似,但是不局限于注解内(我是这么理解的)。可以在正常代码的任意地方替代字符串使用。

  • 資深大佬 : selca

    JSR269 实现的东西?

  • 資深大佬 : yazinnnn

    这侵入性都快大过直接换 kotlin 了…

  • 資深大佬 : luozic

    为啥不上 kotlin or 用 groovy scala 算求…,反正 Java 的模式匹配基本等于零

  • 資深大佬 : sheeta

    我选择 PHP

  • 資深大佬 : wunonglin

    这不就是 js 的
    “`
    const value = ‘YO’
    console.log(`Hello: ${ value }`)
    “`
    么

  • 資深大佬 : cheng6563

    这。。。,lombok 这种加注释处理器的都一堆人不舍得用,你这还直接改 javac 了

  • 資深大佬 : Yohann97

    模板字符串?谁说我没用过 Hutool util

  • 主 資深大佬 : 122006

    @selca 不是,比 JSR269 靠前,重载的词法分析器.JSR269 不好做这种动态代码

  • 資深大佬 : cheng6563

    @cheng6563 我盲了,无视这句话

  • 主 資深大佬 : 122006

    @cheng6563 可以不用,但是要有,这不过分吧。改 javac 的项目也不少,和 lombok 一样,用不用看个人自己选择。重写 javac 又没有引发别的问题,一棍子打死没意义

  • 主 資深大佬 : 122006

    @luozic 比如你就是要用 java 写呢,比如老项目比如就是有 java 的需求。提供一个可选性,并不是一定要用

  • 主 資深大佬 : 122006

    @yazinnnn 对使用者单纯使用来说,代码侵入性很低的

  • 資深大佬 : kingfalse

    啊这,说好的外面蹭蹭,结果你都进到了编译层,太深了太深了,

  • 主 資深大佬 : 122006

    @Yohann97 没用过,但这个项目是直接在字符串中引入变量。你可以看看,完全不一样

  • 主 資深大佬 : 122006

    @kingfalse lombok 和其他几个重载运算符啊的几个库,也是改的编译过程。(虽然都没有这个项目改得深)

  • 資深大佬 : arvinsilm

    只是单纯的字符串替换功能,并且会造成可读性下降(不符合标准 Java 语法,缺少其他语言经验的 Java 程序员会比较懵)。适合个人项目吧

  • 主 資深大佬 : 122006

    @arvinsilm 功能上不存在非用不可的情况,只是对 java 中字符串使用的一个优化。语法和其他语言的类似,其实学习成本也不是很高。
    多谢支持,让大家写个人项目的时候,能够更快捷直观一点也足够了,毕竟确实解决了我自己一大痛点

  • 資深大佬 : meiyoumingzi6

    有点像 python 的 f-string

  • 資深大佬 : passerbytiny

    刷小聪明推广,滚粗。

    顺便提一下,Lombok 是用注解替代模板代码(本质上跟切面编程没啥区别),Groovy 、kotlin 是额外套了一套语法(本质上算另一种语言了)。主这个,就纯粹是侵入式语法糖,相当于“不习惯英语就让说英语的人去说汉语”。

  • 主 資深大佬 : 122006

    @passerbytiny 首先标题让你点进来很不好意思,用了上个世纪的推广方式
    lombok 不仅仅是代替了 getset 模板方法,其特性中还有诸如 val var 之类的语法糖,和面向切面编程的概念完全不一致
    语法糖当然是侵入式,不侵入的语法糖是什么?
    至于说汉语的问题,我并不是提出一个倡议一定要怎么做,而是提出了一个可能。
    如果对语法糖没有追求的话,那没必要升级 java8,用 7 甚至用 6 不是更好?(当然还有别的好处)
    真要争执的话,那转用 kotlin 的岂不是为了不说英语直接撞墙投胎了么?
    总而,爱用用,不用的话很抱歉让诸位点进来,毕竟标题确实不对。抱歉

  • 資深大佬 : Cbdy

    很棒,别出心裁,但是你用了$,那别的也用了$的库就捉急了,我也有个库用了$

  • 主 資深大佬 : 122006

    @Cbdy 感谢支持。
    其实没影响,当前版本偷懒了,只会分析代码中是$的方法,并对其中的硬编码字符串进行解析,所以其他库的$方法也会进行解析的。只要硬编码字符串中不涉及$的,没有问题的
    当然这样的方案确实不 OK,后续版本会通过分析 import 引用,只会拦截我这个方法里的参数

  • 資深大佬 : luchong

    C#:基本操作!! var str=$”hello,{name}”;

  • 資深大佬 : Kirsk

    表示很反感这种语法 –quote JAVA 程序员却只能痛苦地用密密麻麻的加号拼接 枚举不会 StringBuilder 放着看的? StringJoin 用过吗 没用过是不是可以开喷了

  • 資深大佬 : hantsy

    @122006 java 15 有 Text block,要什么拼接。

  • 資深大佬 : luozic

    扩展语法,用法 lombok ;或者模板引擎?

  • 資深大佬 : Cbdy

    @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 年了,看看 java 的生态
    要是真想搓点新鲜的, 可以选择那几个大框架贡献贡献
    闭门造螺丝 还起这个标题真的不多说了

  • 資深大佬 : micean

    挺好的东西,出来的有点晚,另外字符串模板还需要一个很关键的就是渲染高亮

  • 資深大佬 : crclz

    C#的东西被各种语言都偷完了

  • 資深大佬 : qiezixiansheng

    啊,这

  • 資深大佬 : dswyzx

    我日哦,第一次心疼 javaer

  • 主 資深大佬 : 122006

    @Kirsk 比如打印日志之类的如果要大量括号之类的格式,括号是很常见的。你打印个日志也写个十多行的 Stringbuilder ?

  • 主 資深大佬 : 122006

    @micean 可以看看里图片或者项目中的图片喔。这是支持内插的代码段渲染高亮的

  • 資深大佬 : Kirsk

    @122006 你搞笑嘛 可变参数不行?在你眼里只有一个个操作 没看懂再仔细看 不限场景 如果还没懂 麻烦去补下程序如何抽象

  • 資深大佬 : Kirsk

    @122006 再补充 定义好你要的格式去抽象 也要比这种奇葩实现简单 那你觉得不行 就丢个例子

  • 主 資深大佬 : 122006

    @tamer 不好意思,标题起得确实不太恰当

  • 主 資深大佬 : 122006

    @Kirsk 不要暴躁,我保证不强迫你用。可变参数接受参数进行拼接的时候,会有额外的引号和参数间的空格。额外的行字节数会引发自动换行等问题,阅读的时候这个拼接字符串也并不连贯。
    比如 lambda 表达式,你还是更加会使用 java7 的匿名内部类表示?反正也可以实现这个效果

  • 主 資深大佬 : 122006

    @Cbdy 有个问题,你需要一个临时名字来代替每个代码块。这个其实起名字很麻烦且没有意义,而且还会涉及重名等问题,比如单个变量。。。。
    而且可能传入一个 map 也需要多行代码来实现

  • 資深大佬 : Kirsk

    @122006 辨无可辨 show me the code

  • 資深大佬 : zzl22100048

    可以加个文本块的糖配合一下

  • 資深大佬 : newmlp

    我连 Java 都没写过,更何况 Java 这种语法了

  • 資深大佬 : micean

    @122006 抱歉,因为图片打不开,我想当然啦

  • 資深大佬 : xiaowangge

    @Livid 标题党、推广。

  • 主 資深大佬 : 122006

    @zzl22100048 文本块语法糖在 java15 有提供支持。就不班门弄斧做重复方法了

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具