V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
122006
V2EX  ›  推广

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

  •  
  •   122006 · 2021-02-05 14:54:26 +08:00 · 8000 次点击
    这是一个创建于 1421 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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,让摸鱼变得更加快乐~
    第 1 条附言  ·  2021-02-05 16:04:52 +08:00

    放一个使用效果图片(纯java中使用) 和String.format()之类完全不一样 使用图片

    第 2 条附言  ·  2021-02-07 11:01:33 +08:00

    好像很多人都看不到图片,换个图床发一下

    图片

    https://ae01.alicdn.com/kf/U99d3e32cf6824b1d8e5bedf2248b94f5x.jpg

    该项目和业界的文本替换的方法完全不一样,

    希望在享受java良好生态的同时,获得其他语言的便利性

    122006
        1
    122006  
    OP
       2021-02-05 14:56:27 +08:00
    讲道理,虽然应该都是被标题骗进来的,但是应该都不亏吧。
    觉得这个项目做得可以欢迎给个 star 哦
    handle233
        2
    handle233  
       2021-02-05 15:00:56 +08:00
    这是不是该放在推广节点?
    chendy
        3
    chendy  
       2021-02-05 15:07:15 +08:00   ❤️ 2
    我第一反应是 label break
    结果是推广自己的项目,啊这,应该发推广节点吧
    Kasumi20
        4
    Kasumi20  
       2021-02-05 15:08:22 +08:00   ❤️ 1
    我选择换到 Kotlin
    YouLMAO
        5
    YouLMAO  
       2021-02-05 15:09:29 +08:00 via Android   ❤️ 1
    不能发推广,应该直接扔垃圾箱,为了写个字符串,串改这么多,🧧🧧🧧🧧🧧🧧🧧🧧🧧🧧🧧
    Rwing
        6
    Rwing  
       2021-02-05 15:11:10 +08:00   ❤️ 2
    考虑一下 C# ? 😊
    var name = "world";
    var text = $@"
    <title>
    hello {name}
    </title>
    ";
    dqzcwxb
        7
    dqzcwxb  
       2021-02-05 15:17:23 +08:00   ❤️ 4
    没用过 MessageFormat.format()是吧?
    AndyAO
        8
    AndyAO  
       2021-02-05 15:17:55 +08:00
    很好的项目

    Java 在语法方面确实很保守

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

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

    Go 好像也是这种设计思路,语法上的特性,给的比其他的新型语言要少得多
    hehe12980
        9
    hehe12980  
       2021-02-05 15:28:59 +08:00
    这玩意不就是 Groovy 里的语法么 通常 def a = 'love', def b = "${a} you" , 不过 java 拼字符 确实鸡儿类累
    122006
        10
    122006  
    OP
       2021-02-05 15:32:33 +08:00
    @Kasumi20 老项目切换 kotlin 还是不可能的,java 目前还是主流。这个更多是一个小插件,进行一个小的功能的优化
    122006
        11
    122006  
    OP
       2021-02-05 15:34:14 +08:00   ❤️ 1
    @hehe12980 没错,就是用的 Groovy 的语法(也是选择 Groovy 作为 Language Injection 的语言),甚至 Kotlin 也有类似的。
    大家都有,java 有一个也不过分吧~
    122006
        12
    122006  
    OP
       2021-02-05 15:39:53 +08:00
    @AndyAO 感谢支持,

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

    同理,lombok 这么香的原因

    更何况是 java 拼字符串实在是一言难尽,而且还很常用。看到一堆加号有点脑袋疼
    122006
        13
    122006  
    OP
       2021-02-05 15:40:56 +08:00
    @dqzcwxb 和 String.format()区别不大。你点进去看看就知道了,这个项目完全是两码事
    lllllliu
        14
    lllllliu  
       2021-02-05 15:50:35 +08:00   ❤️ 1
    let a = "Java"
    let b = "Script"
    let str = `${a}${b}`
    mightofcode
        15
    mightofcode  
       2021-02-05 16:31:15 +08:00   ❤️ 4
    我被骗了
    我草泥马
    learningman
        16
    learningman  
       2021-02-05 16:33:25 +08:00
    又不是语言内建支持,有啥用
    122006
        17
    122006  
    OP
       2021-02-05 16:35:27 +08:00
    @mightofcode 这位喷子,你在 java 里面用过么?
    weizhen199
        18
    weizhen199  
       2021-02-05 16:35:57 +08:00
    当年 c#过来写 java 确实这点很难受,还特意自己做了个库
    75er
        19
    75er  
       2021-02-05 16:37:16 +08:00   ❤️ 1
    .neter 摸了摸自己的胡子 这不是基础语法吗?
    122006
        20
    122006  
    OP
       2021-02-05 16:37:54 +08:00
    @75er 不好意思,应该在标题中强调在 java 中使用的语法的
    bugmakerxs
        21
    bugmakerxs  
       2021-02-05 16:43:17 +08:00
    这,不是 springEl 么
    sadfQED2
        22
    sadfQED2  
       2021-02-05 16:44:20 +08:00 via Android
    哈哈,java 也开始抄袭我大 php 了,

    php 果然是世界上最好的语言
    122006
        23
    122006  
    OP
       2021-02-05 16:47:46 +08:00
    @learningman 引入依赖之后,用起来也和语言本身特性区别不大
    122006
        24
    122006  
    OP
       2021-02-05 16:52:42 +08:00
    @bugmakerxs 类似,但是不局限于注解内(我是这么理解的)。可以在正常代码的任意地方替代字符串使用。
    selca
        25
    selca  
       2021-02-05 17:14:46 +08:00 via Android
    JSR269 实现的东西?
    yazinnnn
        26
    yazinnnn  
       2021-02-05 17:21:47 +08:00
    这侵入性都快大过直接换 kotlin 了...
    luozic
        27
    luozic  
       2021-02-05 17:57:21 +08:00 via iPhone
    为啥不上 kotlin or 用 groovy scala 算求…,反正 Java 的模式匹配基本等于零
    sheeta
        28
    sheeta  
       2021-02-05 18:08:07 +08:00
    我选择 PHP
    wunonglin
        29
    wunonglin  
       2021-02-05 18:12:12 +08:00
    这不就是 js 的
    ```
    const value = 'YO'
    console.log(`Hello: ${ value }`)
    ```
    cheng6563
        30
    cheng6563  
       2021-02-05 18:15:18 +08:00 via Android
    这。。。,lombok 这种加注释处理器的都一堆人不舍得用,你这还直接改 javac 了
    Yohann97
        31
    Yohann97  
       2021-02-05 18:15:20 +08:00
    模板字符串?谁说我没用过 Hutool util
    122006
        32
    122006  
    OP
       2021-02-05 18:15:38 +08:00
    @selca 不是,比 JSR269 靠前,重载的词法分析器.JSR269 不好做这种动态代码
    cheng6563
        33
    cheng6563  
       2021-02-05 18:18:19 +08:00 via Android
    @cheng6563 我盲了,无视这句话
    122006
        34
    122006  
    OP
       2021-02-05 18:21:19 +08:00
    @cheng6563 可以不用,但是要有,这不过分吧。改 javac 的项目也不少,和 lombok 一样,用不用看个人自己选择。重写 javac 又没有引发别的问题,一棍子打死没意义
    122006
        35
    122006  
    OP
       2021-02-05 18:23:22 +08:00
    @luozic 比如你就是要用 java 写呢,比如老项目比如就是有 java 的需求。提供一个可选性,并不是一定要用
    122006
        36
    122006  
    OP
       2021-02-05 18:23:50 +08:00
    @yazinnnn 对使用者单纯使用来说,代码侵入性很低的
    kingfalse
        37
    kingfalse  
       2021-02-05 18:24:58 +08:00   ❤️ 2
    啊这,说好的外面蹭蹭,结果你都进到了编译层,太深了太深了,
    122006
        38
    122006  
    OP
       2021-02-05 18:25:28 +08:00
    @Yohann97 没用过,但这个项目是直接在字符串中引入变量。你可以看看,完全不一样
    122006
        39
    122006  
    OP
       2021-02-05 18:26:55 +08:00
    @kingfalse lombok 和其他几个重载运算符啊的几个库,也是改的编译过程。(虽然都没有这个项目改得深)
    arvinsilm
        40
    arvinsilm  
       2021-02-05 18:28:05 +08:00
    只是单纯的字符串替换功能,并且会造成可读性下降(不符合标准 Java 语法,缺少其他语言经验的 Java 程序员会比较懵)。适合个人项目吧
    122006
        41
    122006  
    OP
       2021-02-05 18:45:43 +08:00 via Android
    @arvinsilm 功能上不存在非用不可的情况,只是对 java 中字符串使用的一个优化。语法和其他语言的类似,其实学习成本也不是很高。
    多谢支持,让大家写个人项目的时候,能够更快捷直观一点也足够了,毕竟确实解决了我自己一大痛点
    meiyoumingzi6
        42
    meiyoumingzi6  
       2021-02-05 19:17:09 +08:00
    有点像 python 的 f-string
    passerbytiny
        43
    passerbytiny  
       2021-02-05 19:20:41 +08:00 via Android
    刷小聪明推广,滚粗。

    顺便提一下,Lombok 是用注解替代模板代码(本质上跟切面编程没啥区别),Groovy 、kotlin 是额外套了一套语法(本质上算另一种语言了)。楼主这个,就纯粹是侵入式语法糖,相当于“不习惯英语就让说英语的人去说汉语”。
    122006
        44
    122006  
    OP
       2021-02-05 19:45:57 +08:00 via Android
    @passerbytiny 首先标题让你点进来很不好意思,用了上个世纪的推广方式
    lombok 不仅仅是代替了 getset 模板方法,其特性中还有诸如 val var 之类的语法糖,和面向切面编程的概念完全不一致
    语法糖当然是侵入式,不侵入的语法糖是什么?
    至于说汉语的问题,我并不是提出一个倡议一定要怎么做,而是提出了一个可能。
    如果对语法糖没有追求的话,那没必要升级 java8,用 7 甚至用 6 不是更好?(当然还有别的好处)
    真要争执的话,那转用 kotlin 的岂不是为了不说英语直接撞墙投胎了么?
    总而,爱用用,不用的话很抱歉让诸位点进来,毕竟标题确实不对。抱歉
    Cbdy
        45
    Cbdy  
       2021-02-05 19:51:28 +08:00 via Android
    很棒,别出心裁,但是你用了$,那别的也用了$的库就捉急了,我也有个库用了$😳
    不知道有什么好的兼容方法
    122006
        46
    122006  
    OP
       2021-02-05 20:00:34 +08:00 via Android
    @Cbdy 感谢支持。
    其实没影响,当前版本偷懒了,只会分析代码中是$的方法,并对其中的硬编码字符串进行解析,所以其他库的$方法也会进行解析的。只要硬编码字符串中不涉及$的,没有问题的
    当然这样的方案确实不 OK,后续版本会通过分析 import 引用,只会拦截我这个方法里的参数
    luchong
        47
    luchong  
       2021-02-05 20:13:03 +08:00
    C#:基本操作!! var str=$"hello,{name}";
    Kirsk
        48
    Kirsk  
       2021-02-05 20:17:02 +08:00
    表示很反感这种语法 --quote JAVA 程序员却只能痛苦地用密密麻麻的加号拼接 枚举不会 StringBuilder 放着看的? StringJoin 用过吗 没用过是不是可以开喷了
    hantsy
        49
    hantsy  
       2021-02-05 20:50:24 +08:00
    @122006 java 15 有 Text block,要什么拼接。
    luozic
        50
    luozic  
       2021-02-05 20:57:17 +08:00
    扩展语法,用法 lombok ;或者模板引擎?
    Cbdy
        51
    Cbdy  
       2021-02-05 21:02:55 +08:00 via Android
    @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
        52
    tamer  
       2021-02-05 22:55:13 +08:00
    兄弟,2021 年了,看看 java 的生态
    要是真想搓点新鲜的, 可以选择那几个大框架贡献贡献
    闭门造螺丝 还起这个标题真的不多说了
    micean
        53
    micean  
       2021-02-05 23:00:08 +08:00 via Android
    挺好的东西,出来的有点晚,另外字符串模板还需要一个很关键的就是渲染高亮
    crclz
        54
    crclz  
       2021-02-05 23:34:40 +08:00
    C#的东西被各种语言都偷完了
    qiezixiansheng
        55
    qiezixiansheng  
       2021-02-06 00:39:07 +08:00
    啊,这
    dswyzx
        56
    dswyzx  
       2021-02-06 01:01:58 +08:00 via iPhone
    我日哦,第一次心疼 javaer
    122006
        57
    122006  
    OP
       2021-02-06 01:11:43 +08:00 via Android
    @Kirsk 比如打印日志之类的如果要大量括号之类的格式,括号是很常见的。你打印个日志也写个十多行的 Stringbuilder ?
    122006
        58
    122006  
    OP
       2021-02-06 01:15:11 +08:00 via Android
    @micean 可以看看楼里图片或者项目中的图片喔。这是支持内插的代码段渲染高亮的
    Kirsk
        59
    Kirsk  
       2021-02-06 01:16:45 +08:00 via Android
    @122006 你搞笑嘛 可变参数不行?在你眼里只有一个个操作 没看懂再仔细看 不限场景 如果还没懂 麻烦去补下程序如何抽象
    Kirsk
        60
    Kirsk  
       2021-02-06 01:18:17 +08:00 via Android
    @122006 再补充 定义好你要的格式去抽象 也要比这种奇葩实现简单 那你觉得不行 就丢个例子
    122006
        61
    122006  
    OP
       2021-02-06 01:19:07 +08:00 via Android
    @tamer 不好意思,标题起得确实不太恰当
    122006
        62
    122006  
    OP
       2021-02-06 01:31:00 +08:00 via Android
    @Kirsk 不要暴躁,我保证不强迫你用。可变参数接受参数进行拼接的时候,会有额外的引号和参数间的空格。额外的行字节数会引发自动换行等问题,阅读的时候这个拼接字符串也并不连贯。
    比如 lambda 表达式,你还是更加会使用 java7 的匿名内部类表示?反正也可以实现这个效果
    122006
        63
    122006  
    OP
       2021-02-06 01:34:01 +08:00 via Android
    @Cbdy 有个问题,你需要一个临时名字来代替每个代码块。这个其实起名字很麻烦且没有意义,而且还会涉及重名等问题,比如单个变量。。。。
    而且可能传入一个 map 也需要多行代码来实现
    Kirsk
        64
    Kirsk  
       2021-02-06 01:41:37 +08:00 via Android
    @122006 辨无可辨 show me the code
    zzl22100048
        65
    zzl22100048  
       2021-02-06 02:33:09 +08:00 via iPhone
    可以加个文本块的糖配合一下
    newmlp
        66
    newmlp  
       2021-02-06 09:58:03 +08:00
    我连 Java 都没写过,更何况 Java 这种语法了
    micean
        67
    micean  
       2021-02-06 09:59:58 +08:00 via Android
    @122006 抱歉,因为图片打不开,我想当然啦
    xiaowangge
        68
    xiaowangge  
       2021-02-06 10:45:10 +08:00   ❤️ 1
    @Livid 标题党、推广。
    122006
        69
    122006  
    OP
       2021-02-07 08:20:17 +08:00 via Android
    @zzl22100048 文本块语法糖在 java15 有提供支持。就不班门弄斧做重复方法了
    122006
        70
    122006  
    OP
       2021-02-10 08:57:11 +08:00
    并不是常规字符串占位替代方法哦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   940 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 21:43 · PVG 05:43 · LAX 13:43 · JFK 16:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.