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

今天写业务被垃圾 Java 坑了一把,折腾了一个下午(辱骂性质

  •  
  •   Kilerd · 2019-08-09 20:58:52 +08:00 · 3196 次点击
    这是一个创建于 1968 天前的主题,其中的信息可能已经有所发展或是发生改变。

    根本想不到 Java 的 split 函数还跟其他语言的表现不一样,惊了。

    javascript

    "1\n\n\n\n\n".split("\n")
    

    结果

    ["1", "", "", "", "", ""]
    

    python

    "1\n\n\n\n\n".split("\n")
    

    结果

    ['1', '', '', '', '', '']
    

    golang

    package main
    
    import (
    	"fmt"
    	"strings"
    )
    
    func main() {
    	fmt.Println(len(strings.Split("1\n\n\n\n\n", "\n")))
    }
    

    结果 6

    可是 java

    "1\n\n\n\n\n".split("\n")
    

    只有一个结果

    ["1"]
    

    绝了,组里基本没人猜出来。 应该说根本想不到是这里的原因导致的 bug

    Screen Shot 2019-08-09 at 8.54.52 PM.png

    19 条回复    2019-08-10 14:41:46 +08:00
    Nasei
        1
    Nasei  
       2019-08-09 21:15:11 +08:00
    java 的话应该只有尾部的空字符串不包含

    还是我大 C#好,可以传 StringSplitOptions
    klesh
        2
    klesh  
       2019-08-09 21:25:55 +08:00 via Android
    Java 先于这三个语言面世
    smeraldo
        3
    smeraldo  
       2019-08-09 21:28:22 +08:00 via Android
    @klesh 你确定 Java 比 Python 早?
    v2survive
        4
    v2survive  
       2019-08-09 21:48:11 +08:00 via Android
    `"1\n\n\n\n\n".split("\n", -1)`
    Leigg
        5
    Leigg  
       2019-08-09 21:53:44 +08:00 via Android
    pyer 表示有点反人类
    gabon
        6
    gabon  
       2019-08-09 21:57:22 +08:00 via Android
    这是 feature 不是 bug😏
    crella
        7
    crella  
       2019-08-09 22:06:38 +08:00
    my str $str = "1\n\n\n\n\n"; say $str.split("\n");
    > (1 )
    jamesxu
        8
    jamesxu  
       2019-08-09 22:17:43 +08:00 via iPhone
    请用 guava 的 splitter
    anzu
        9
    anzu  
       2019-08-09 22:20:28 +08:00
    同坑 2333 /t/568469
    lululau
        10
    lululau  
       2019-08-09 22:23:55 +08:00   ❤️ 5
    有啥问题吗,写代码先看文档啊,再说了也不是只有 Java 是这种行为啊,Perl / Ruby 的字符串 split 函数 /方法默认也是去掉末尾的空值啊
    20015jjw
        11
    20015jjw  
       2019-08-09 22:55:18 +08:00 via Android
    只能说这两种逻辑都合理吧..
    Kilerd
        12
    Kilerd  
    OP
       2019-08-09 23:02:44 +08:00
    @lululau #10 这样做没问题,但是在其他语言同样函数的基础下,很难想象得到是这个那么日常的函数的问题。
    如果写代码这种常见函数都需要查文档,那就太过分了。
    FreeEx
        13
    FreeEx  
       2019-08-09 23:18:18 +08:00 via iPhone
    第二个参数传-1 即可,语言之间设计的不同也是骂点?
    iPhoneXI
        14
    iPhoneXI  
       2019-08-09 23:19:23 +08:00
    写多语言是这样的
    不查好 api 文档说不定哪里就是坑
    所以不要贸然在生产环境换语言
    个人项目就多看文档多谷歌了
    klesh
        15
    klesh  
       2019-08-09 23:21:47 +08:00 via Android
    @smeraldo 我错了
    conn4575
        16
    conn4575  
       2019-08-10 05:04:28 +08:00 via Android
    还有个 replace 方法,居然是正则替换,第一次用惊呆了
    Amance
        17
    Amance  
       2019-08-10 09:39:04 +08:00
    大哥,基础不够不要多 BB
    oahebky
        18
    oahebky  
       2019-08-10 10:41:46 +08:00 via Android
    好语言 /语法应该是符合自觉的,或者说尽可能地符合直觉,只有在技术限制或逻辑限制的情况下反自觉是可以理解的。

    不过我个人认为用一个没写过的方法,尽可能地写 hello world 级别的程序验证,试一试比较好,然后再写进代码中去(像解释型语言就直接在 repl 中试比较容易)。
    justin2018
        19
    justin2018  
       2019-08-10 14:41:46 +08:00
    这是 feature 不是 bug 吧~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   988 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:53 · PVG 03:53 · LAX 11:53 · JFK 14:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.