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

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

  •  
  •   122006 · 347 天前 · 6907 次点击
    这是一个创建于 347 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 条附言  ·  346 天前

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

    第 2 条附言  ·  345 天前

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

    图片

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

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

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

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

    Java 在语法方面确实很保守

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

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

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

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

    同理,lombok 这么香的原因

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

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

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