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

关于 Java 很啰嗦的问题

  •  3
     
  •   Joker123456789 · 2022-05-12 12:19:17 +08:00 · 20796 次点击
    这是一个创建于 927 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我先声明啊,我不是来吹捧 java 的,我只是想说一个事实,编程语言 没有谁绝对的碾压谁,真遇到了实际业务需求,写出来的代码量绝对是半斤八两。

    我希望大家 在 吐槽一门语言的时候,可以理性一点,不要瞎喷。这篇文章的用意就在于此。

    还有一点,我用 go 来比较,是因为 go 擅长的场景,跟 java 有一定的重叠,有很多公司都用 go 开发 web 。绝对没有对 go 不敬的意思。

    首先目录问题

    image.png

    总结下来,从工作量的角度来看,就是多了一个倒置的域名而已,而且只需要花建一层目录的时间,并且这个倒置的域名 是有他的意义在里面的,你们可以把他看做是这个

    // go 语言里的 import ,前面也有一个域名+项目名 来确定唯一性,包名里的倒置域名就是起这个作用的
    import "github.com/scan-util/xxx/xxx"
    

    还有很重要的一点,你们喷来喷去的那些多余的目录结构,在我们的观念里 根本就不存在,因为从来没有手工去创建过,要不是你们来吐槽,我们还真想不到这一点。

    不是因为 习惯了,而是真的从来没有为他们花过 5 秒钟以上的时间。有的连一毫秒都没花过。

    方法语法

    go

    func BytesToString(val []byte) string
    

    java

    public String BytesToString(byte[] val)
    

    我真没看出来多了什么东西

    定义变量

    go

    name := "张三";
    
    var map = make(map[string]interface{})
    var array = make(string[], 10);
    

    java

    String name = "张三";
    
    Map<String, Object> map = new HashMap<>();
    String[] array = new String[10];
    
    

    好像多了点东西,又好像没多什么。

    循环

    go

    for(i:=0;i<100;i++){
    
    }
    
    for(i<100){
    
    }
    

    java

    for(int i=0;i<100;i++){
    
    }
    
    while(i<100){
    
    }
    

    确实多了几个字母。

    创建类

    go

    我知道这叫结构体,跟类是两码事,但是 go 就是用它来兼容 oop 的,所以我只能用它来举例子,因为没有其他语法可以实现 oop 了

    type DemoParam struct {
        name string
    }
    
    func (demoParam *DemoParam) FormValues(key string) []string {
    }
    

    java

    class DemoParam {
        public String name;
        
        public String[] FormValues(String key){
            
        }
    }
    

    字数上相差多少,我是懒得数了,但是你们真的不觉得 java 的结构更清晰吗? 其他的继承,多态 我就不拿出来说了,go 基本上是 用的 c 的编程思想,oop 只是个兼容, 所以用 java 来跟他比 oop 没什么可比性。因为是两个方向。

    异常处理

    go

    
    func testFunction(paramStr string) (string, error) {
        if xxx {
            return Errors.New("xxxx");
        }
    }
    
    paramStr, err := testFunction("ok")                              
    if err != nil {                           
        log.Println(err.Error())                           
    }
    

    java

    public String testFunction(String paramStr){
        if (xxx) {
            throw new Execption("xxx");
        }
    }
    
    try {
        String paramStr = testFunction("ok");
    } catch(Execption e){
        log.Println(e.getMessage); 
    }
    

    这个看起来 go 好像 舒服一点,但是,实际场景下 go 经常是这种姿势

    paramStr, err := testFunction("ok")                              
    if err != nil {                           
        log.Println(err.Error())                           
    }
    
    paramStr, err := testFunction2("ok")                              
    if err != nil {                           
        log.Println(err.Error())                           
    }
    
    paramStr, err := testFunction3("ok")                              
    if err != nil {                           
        log.Println(err.Error())                           
    }
    

    而 java 还是只需要这样

    try {
        String paramStr = testFunction("ok");
        String paramStr = testFunction2("ok");
        String paramStr = testFunction3("ok");
    } catch(Execption e){
        log.Println(e.getMessage); 
    }
    

    并且这是 经过人为判断后,返回的错误提示,如果是意外的异常呢? go 里面叫 panic ,java 只要用 try catch 包住了 就可以捕获,但是 go 需要用 defer ,而且一旦抛出异常就意味着这个函数结束了,你如果想在出异常后,处理一下 然后继续往下走,go 会非常的麻烦。

    拆箱

    go

    // 如果有一个 interface{} 类型的变量 a ,想转成 int
    // 你必须明确的知道,他装箱前就是 int ,不然根本没法拆,必须做一下类型判断。
    // 我之前在写框架的时候 就被折磨的够呛,一大堆不必要的 if
    

    java

    // 不管装箱前是什么,只要他的值是一个整数
    // 无论是 1 , 还是 "1", 都可以这么转
    Integer aInt = Integer.parseInteger(a.toString());
    
    // 也可以直接拆成 String
    a.toString();
    

    如果你们还不服,那很好办,

    你们出一个需求给我,我用 java ,你们用 go ,nodejs ,python ,php 随便什么语言,最后来比比 谁的代码少一些。 我敢说,绝对半斤八两,不可能有谁碾压谁的。

    而且还有一定的概率,java 在 丰富的生态+强大官方库的 加持下,可以更快完成。

    第 1 条附言  ·  2022-05-12 13:14:21 +08:00
    补充一点,给我出题的前提是,你们带着自己的代码过来。并说清楚需求
    257 条回复    2022-11-14 13:32:01 +08:00
    1  2  3  
    BeautifulSoap
        1
    BeautifulSoap  
       2022-05-12 12:22:04 +08:00   ❤️ 2
    目测要战起来,最近在学 Kotlin 的表示前排吃瓜
    iyear
        2
    iyear  
       2022-05-12 12:29:05 +08:00   ❤️ 13
    百楼预定🤣
    chengyiqun
        3
    chengyiqun  
       2022-05-12 12:30:36 +08:00
    我个人也是觉得 java 好用的, 至少在写大型项目的时候, 我优先考虑 java.
    考虑性能或者写小工具,爬虫, 才考虑用其他语言.
    frisktale
        4
    frisktale  
       2022-05-12 12:31:37 +08:00   ❤️ 4
    需求:在控制台输出 "Hello World"
    C# 一行 https://gist.github.com/frisktale/abbe6536b0adbce34067f63643cab97f
    java ?行
    Goooooos
        5
    Goooooos  
       2022-05-12 12:32:08 +08:00 via Android
    没必要没必要,爱喷 java 的人,你说再多他也能找到要喷的点
    vchroc
        6
    vchroc  
       2022-05-12 12:33:05 +08:00 via iPhone
    go 糖太少,味儿苦啊
    chengyiqun
        7
    chengyiqun  
       2022-05-12 12:34:37 +08:00
    @frisktale C#我承认比 java 优秀, 奈何用的人少很多, 生态没 java 丰富
    chengyiqun
        8
    chengyiqun  
       2022-05-12 12:35:11 +08:00
    @frisktale 我上大学的时候, 本来也想学 C#的, 后来还是学 java 了.
    chengyiqun
        9
    chengyiqun  
       2022-05-12 12:41:56 +08:00   ❤️ 1
    @frisktale 你省略了 class 包, main 函数
    实际上 java 省略这些, 也是一行啊
    [url=https://imgtu.com/i/OwzCkQ][img]https://s1.ax1x.com/2022/05/12/OwzCkQ.png[/img][/url]
    dreamlike
        10
    dreamlike  
       2022-05-12 12:44:10 +08:00
    java 的最大意义还得是 jvm ,真写代码不如 kotlin 表达力,kotlin dsl 多好。
    如果只是写 spring 这种业务脚本,用啥都一样
    Joker123456789
        11
    Joker123456789  
    OP
       2022-05-12 12:44:18 +08:00   ❤️ 1
    @frisktale System.out.print("Hello word"); 你能出点高端的吗? 就知道打印 hello Word ?
    zacharyjia
        12
    zacharyjia  
       2022-05-12 12:46:40 +08:00   ❤️ 1
    @Joker123456789 他说的是 c#的 top-level 程序,可以跟脚本语言一样,不用类和方法什么的,直接写了就运行。印象中 java 好像确实不行
    6IbA2bj5ip3tK49j
        13
    6IbA2bj5ip3tK49j  
       2022-05-12 12:48:38 +08:00   ❤️ 1
    @frisktale C#天天就写 hello world 吗?

    ```
    public class X{
    public static void main(String[] args){
    System.out.println("Hello World");
    }
    }
    ```
    Java 是 5 行,这种对比屁用没有,别的语言可以说 Java 分层繁琐啥的,C#也配?
    而且,我搜了一下,C#正常也不是一行啊。
    https://www.programiz.com/csharp-programming/hello-world
    我没写过 C#,你确定你不是拿着 repl 语句在对比?如果是 repl 语句,那 java 也是一句。
    me221
        14
    me221  
       2022-05-12 12:49:12 +08:00   ❤️ 6
    吵赢了能加工资吗
    zacharyjia
        15
    zacharyjia  
       2022-05-12 12:50:36 +08:00   ❤️ 1
    @xgfan 参考我上面的评论,关键词 'c# top-level' 可以搜一下。人家说的确实是对的,但是意义多大不好评论
    Alexliu
        16
    Alexliu  
       2022-05-12 12:51:10 +08:00   ❤️ 7
    {
    "code":200,
    "message":"success",
    "data":{
    "person":{
    "meta":{
    "address":{
    "nation":"印度尼西亚"
    },
    "custom":{
    "key":"value"
    }
    },
    "name":"王德发",
    "age":16
    },
    "role":"teacher"
    }
    }

    请用 Java 解析以上 JSON ,并判断用户 nation 是否为印度尼西亚,返回结果的每一层都有可能为空。。。。
    kujio
        17
    kujio  
       2022-05-12 12:52:07 +08:00
    想看 java 和 kotlin
    ration
        18
    ration  
       2022-05-12 12:53:08 +08:00 via Android   ❤️ 2
    具体还是看看泛型的实现,内存管理,线程模型这些。比语法糖的话我投 C#。目录差不多长就可以了,更多的是一个观感问题,其实我感觉太长的目录也影响性能,虽然有时候可忽略不计。
    ColinZeb
        19
    ColinZeb  
       2022-05-12 12:53:50 +08:00   ❤️ 2
    没想到 java 也有洗白的一天
    属性不提?
    泛型不提?
    模式匹配不提?
    如果 java 和其他与语言大差不差,不知道出来那么多 jvm 衍生语言是干嘛的
    6IbA2bj5ip3tK49j
        20
    6IbA2bj5ip3tK49j  
       2022-05-12 12:54:32 +08:00   ❤️ 3
    Java 的啰嗦不是语言层面的,而是有点玄学的“社区 /文化”层面。
    当开始使用 Java 了,就会习惯性分一堆层,三层三层又三层,定义一堆长的差不多的 DTO/VO/xxO 。

    让用 Java 社区的做法去用 Kotlin ,就会发现,哪怕是语法糖甜到齁的 kotlin ,在不大范围重构的前提下重写 Java 项目,也只能节省 10%-20%左右的代码行数。
    Joker123456789
        21
    Joker123456789  
    OP
       2022-05-12 12:54:45 +08:00   ❤️ 1
    @Alexliu 你是想要我用 jackson 还是 fastjson 还是 gson ? 然后麻烦你用你喜欢的语言 也写一个版本。
    FungKao
        22
    FungKao  
       2022-05-12 12:55:10 +08:00
    @xgfan C# 10 真的就可以在 Program.cs 文件中写一行就可以了。语法糖,编译器会帮你把剩下的代码补上。
    Joker123456789
        23
    Joker123456789  
    OP
       2022-05-12 12:55:23 +08:00
    @ColinZeb 请具体说明
    Alexliu
        24
    Alexliu  
       2022-05-12 12:56:42 +08:00
    @Joker123456789 用哪个都无所谓,麻烦的地方在于解析成对象或者 JsonObj 之后每一层都需要判断
    knightdf
        25
    knightdf  
       2022-05-12 12:56:47 +08:00   ❤️ 1
    骂 Java 已经变成 zz 正确,不然怎么凸显他们牛逼呢
    ColinZeb
        26
    ColinZeb  
       2022-05-12 12:56:57 +08:00
    https://v2ex.com/t/837916
    楼主看看 java 实现这样的功能需要写多少代码
    silentsky
        27
    silentsky  
       2022-05-12 12:57:52 +08:00   ❤️ 1
    那些喷 java 的,其实对 java 只是一知半解,习惯了。语法上 java 其实没什么可挑剔的
    ColinZeb
        28
    ColinZeb  
       2022-05-12 13:01:09 +08:00
    或者看看 kotlin 、scala 、groovy 的说明书 他们为什么要创造这些语言 这些语言较 java 有什么区别
    6IbA2bj5ip3tK49j
        29
    6IbA2bj5ip3tK49j  
       2022-05-12 13:02:17 +08:00   ❤️ 1
    @zacharyjia 我想不到‘c# top-level’这个在生产上能用在哪儿。
    java 写成 jshell script 也是一行,也能直接运行。
    ```
    jshell jscript.jsh
    ```
    顺便提一下,连 python 都是推荐写 if __name__ == "__main__" 的
    hhjswf
        30
    hhjswf  
       2022-05-12 13:02:23 +08:00
    @Alexliu optional...
    DOLLOR
        31
    DOLLOR  
       2022-05-12 13:03:54 +08:00 via Android   ❤️ 5
    哈哈,平时在前端的主题下都在群嘲前端娱乐圈呢,结果后端领域不也一样嘛?🤣🤣
    AllenHua
        32
    AllenHua  
       2022-05-12 13:09:27 +08:00   ❤️ 8
    我首先就给楼主这种认真钻研、客观中立的精神一个赞
    Lancer777
        33
    Lancer777  
       2022-05-12 13:16:01 +08:00
    @ColinZeb 你说的这些 Go 也没有啊……而且大部分 Java 程序员本来就知道没法和 C#比语法糖啊,但是 Go 程序员来喷什么,配吗?
    1rror
        34
    1rror  
       2022-05-12 13:20:56 +08:00
    想看到 C#过来 battle 。
    nba2k9
        35
    nba2k9  
       2022-05-12 13:25:16 +08:00
    想不到多一些语法糖也能也贬低 Java
    LotusChuan
        36
    LotusChuan  
       2022-05-12 13:25:34 +08:00
    一直感觉语言之间打仗没什么意义,一般语言想上手学个 30%就够用了,边写边查,总共也用不了多少时间,op 发这种主题也算无奈了。有这空发动语言之间宗教战争还不如看点底层点的知识,语言这种顶层的东西就算口水仗打赢了也没什么成就感,输了的反而心里还难受,何必呢。
    lisongeee
        37
    lisongeee  
       2022-05-12 13:31:18 +08:00
    《最后来比比 谁的代码少一些。 我敢说,绝对半斤八两,不可能有谁碾压谁的。》
    你认真的? kotlin 表示在代码量这块碾压 java 是妥妥的
    Maboroshii
        38
    Maboroshii  
       2022-05-12 13:31:43 +08:00
    可能是人啰嗦而不是语言啰嗦? 中位数太低的原因? 说着就变成了地图炮哎。 反正我是见过的
    fantastM
        39
    fantastM  
       2022-05-12 13:33:40 +08:00
    Java 的语法确实不算啰嗦,但是用 Java 的人就不一定了,赞同 https://www.v2ex.com/t/821297?p=1#r_11162935
    Joker123456789
        40
    Joker123456789  
    OP
       2022-05-12 13:34:00 +08:00
    @ColinZeb

    我突然想到一个例子。比如这两种写法

    if(xxx != null){
    xxx.ss();
    }

    --------------------------------------------------------------------------------

    xxx?.ss();

    但是有一个问题,如果 xxx 为空 肯定需要有后续的业务处理的,如果 xxx 为空,导致 ss 没法正常调用,就说明业务没有正常进行,必然需要处理为空的时候。 实际会这样。

    if(xxx == null){
    处理问题
    return ;
    }

    xxx.ss();

    ---------------------------------------------------------------------------------

    Object result = xxx?.ss();

    if(result == null){
    处理问题
    return ;
    }

    我不确定 语法有没有问题,但是这不是重点,我想说的是,如果出现了需要 if 的时候,必然不可能只有一个分支,既然有两个分支,那你在偷懒其中一个分支的时候,另一个分支是偷不了的。

    还有你说的,属性,泛型,请具体阐述。

    至于语言为什么会出现? 我就不多说了,肯定是有差异的,各有优劣。 没必要觉得谁碾压谁。
    lisongeee
        41
    lisongeee  
       2022-05-12 13:36:08 +08:00
    我就加一个限制,强制明确编译期变量的空状态
    java 就得手动加 if(var!=null&&var.k1!=null&&var.k1.k2!=null){var.k1.k2()}
    kotlin 只需要 var?.k1?.k2()
    Joker123456789
        42
    Joker123456789  
    OP
       2022-05-12 13:36:21 +08:00
    @lisongeee 我不反驳你,不知道你是否可以提供一段代码。
    Joker123456789
        43
    Joker123456789  
    OP
       2022-05-12 13:37:15 +08:00
    @lisongeee 你说的 kotlin 的例子,可以看 你的上一层,我刚举了个例子。
    Bazingal
        44
    Bazingal  
       2022-05-12 13:38:00 +08:00   ❤️ 2
    “随便什么语言”,话说得太大了,哪位老哥来个 C#的,什么属性、linq 、泛型、模式匹配、switch 表达、可空类型、null 条件运算符、空合并操作符都给他整上
    billlee
        45
    billlee  
       2022-05-12 13:38:04 +08:00
    比代码少那 kotlin 和 scala 就不服了
    clownpiece
        46
    clownpiece  
       2022-05-12 13:38:09 +08:00
    @Alexliu
    new ObjectMapper().readTree(...).path("data").path("person").path("meta").path("address").path("nation").asText("").equals("印度尼西亚")
    有什么问题吗
    Kinnice
        47
    Kinnice  
       2022-05-12 13:39:38 +08:00   ❤️ 4
    需求:在指定网口上,丢弃 GFW DNS 污染包(即获取到正常干净的 dns 解析结构)

    Rust: https://raw.githubusercontent.com/ihciah/clean-dns-bpf/master/src/clean_dns.rs

    期待 ing
    lisongeee
        48
    lisongeee  
       2022-05-12 13:44:23 +08:00
    @Joker123456789 我看了你的例子,你这个例子只有一成属性,实际上我们在使用的过程里会有多层属性,按照你的说法我们岂不是针对每个属性的空都要出逻辑?那岂不是变成了 2^n 个逻辑了?但是实际上我们在写代码的时候往往只是看看这个最终的属性是不是 null 即可,这么说吧, java 和 kotlin 实现你的例子是相同的代码,但是实现我的例子就明显不是一个量级的代码
    silentsky
        49
    silentsky  
       2022-05-12 13:44:32 +08:00
    @lisongeee 可以这样 Optional.ofNullable(var).map(o->o.k1()).map(o->o.k2()).orElse(null);
    abctt
        50
    abctt  
       2022-05-12 13:44:55 +08:00
    @lisongeee 写 spring 代码和 Java 没区别,安卓没写过不知道。
    zilongzixue
        51
    zilongzixue  
       2022-05-12 13:45:17 +08:00
    有一说一用 go 做 web 开发和 java 比简直被碾压
    number
        52
    number  
       2022-05-12 13:46:43 +08:00   ❤️ 1
    Y-Combinator 计算斐波那契数列

    js 版:

    ```js
    (gen => (g => g(g))(f => n => gen(f(f))(n)))(f => n => n > 1 ? f(n - 1) + f(n - 2) : n)(10)
    ```

    go 版:

    ```go
    package main

    import (
    "fmt"
    )

    type (
    commFunc func(int) int
    genFunc func(commFunc) commFunc
    recurseFunc func(recurseFunc) commFunc
    )

    func Y(gen genFunc) commFunc {
    return func(g recurseFunc) commFunc {
    return g(g)
    }(func(f recurseFunc) commFunc {
    return func(n int) int {
    return gen(f(f))(n)
    }
    })
    }

    func fibGen(f commFunc) commFunc {
    return func(n int) int {
    if n == 0 {
    return 0
    } else if n == 1 {
    return 1
    } else {
    return f(n-2) + f(n-1)
    }
    }
    }

    func main() {
    fmt.Println(Y(fibGen)(10))
    }
    ```
    timpaik
        53
    timpaik  
       2022-05-12 13:47:53 +08:00 via Android
    golang 每次都要判断有没有错误的原因就是为了尽可能的消除异常,如果真 panic 了那大概率是没法恢复的,go 要求你在实际业务中处理每一个可能出现的错误。
    楼主用过 Goland 的话应该会知道,开发体验其实和 Java 差不多的。
    很多人觉得 java 啰嗦,不是代码的问题,其实也不是 java 的问题,而是 java 生态里各种写代码前的配置:java 要引入一个包,你得用 gradle ,还没写一行代码就快 7 个文件:

    src/main/java/com/example/exampleproj/main.java
    gradlew
    gradlew.bat
    gradle/wapper 文件夹
    build.gradle
    settings.gradle


    golang 这种自带包管理的就一个 main.go 、go.mod 和 lock 文件就行。
    如果你说你用 IDE ,这种东西不需要你写,从来没管过,那就是你对,不杠。
    pengtdyd
        54
    pengtdyd  
       2022-05-12 13:48:16 +08:00
    从来没有敢说 C 有问题,因为他们知道那是他们唯一的选择!!!
    SeaTac
        55
    SeaTac  
       2022-05-12 13:48:29 +08:00
    2022 年了还能在这里看到为了语言吵架的
    还是工作不够饱和
    DreamSaddle
        56
    DreamSaddle  
       2022-05-12 13:48:58 +08:00
    喷 java 差的有本事自己去实现一门比它牛的再来喷,好吧。
    没有像 Linus Torvalds 那样的功底就别学人家那样 fuck you nvida.
    zhengsidao
        57
    zhengsidao  
       2022-05-12 13:50:23 +08:00   ❤️ 1
    口水战有什么意思...
    大数据后端常年用 java 写,文件目录是为了更好的归纳不同类型的内容,没觉得有多麻烦。。
    判定语言的好坏如果是用文件目录的话,我建议还是去用 excel 来写文档吧
    lisongeee
        58
    lisongeee  
       2022-05-12 13:51:28 +08:00
    java 确实生态和历史沉淀很强大,但是要比新语法和代码量少,这点必须是被 kotlin 按在地上摩擦,就拿 kotlin 的 setter 和 getter ,你 java 调用的时候是 obj.setKey(value)/ obj.getKey(),kotlin 是 obj.key = value/ obj.key , 代码量是不是少了一个层级??还有,java 的 settter 并不是完全封装的, class 内部还是可以绕过 setKey 去修改 key, 但是 kotlin 已经从语法层级决定每个 赋值操作必须走 setter ,在这个层级 java 拿什么和 kotlin 比?
    Leviathann
        59
    Leviathann  
       2022-05-12 13:52:08 +08:00
    终于有 showcase 了,之前一直看空对空的嘴炮早看腻了
    passer9527
        60
    passer9527  
       2022-05-12 13:53:33 +08:00
    强烈支持楼主,甚至可以帮楼主提供代码,说这么多有锤子用,有本事说需求,然后你用 xxx 语言,我用 java ,我们来比一下。
    superchijinpeng
        61
    superchijinpeng  
       2022-05-12 13:54:32 +08:00
    支持楼主
    ohmycorolla
        62
    ohmycorolla  
       2022-05-12 13:55:26 +08:00
    诸君舌战可以休矣 从今讨论到明 从日讨论到夜 能分出个高低贵贱吗 对某种觉得有问题要么不用要么自己想办法去解决 自己吃了这口饭活着还嫌饭骚
    kleis
        63
    kleis  
       2022-05-12 13:55:53 +08:00
    支持楼主
    lisongeee
        64
    lisongeee  
       2022-05-12 13:55:58 +08:00   ❤️ 1
    @silentsky

    《可以这样 Optional.ofNullable(var).map(o->o.k1()).map(o->o.k2()).orElse(null);》

    我的例子是 《 java 就得手动加 if(var!=null&&var.k1!=null&&var.k1.k2!=null){var.k1.k2()}
    kotlin 只需要 var?.k1?.k2()》

    你这里怎么变成了 k1(),k1 是一个属性,不是方法,还有楼主说了,我们比的是代码量

    你这 68 个字符有什么资格碰瓷我 13 个字符???
    aragakiyuii
        65
    aragakiyuii  
       2022-05-12 13:56:37 +08:00   ❤️ 11
    @Alexliu #16 这样应该可以吧
    clownpiece
        66
    clownpiece  
       2022-05-12 13:57:01 +08:00
    @lisongeee 没用过 kotlin ,假设 setter 里有通知变更之类的逻辑,那我类内部就是只想修改值不想触发变更能不能实现呢
    silentsky
        67
    silentsky  
       2022-05-12 13:57:13 +08:00
    kotlin 语法字符确实少,目前生态还不行,讨论当然不是否定彼此,各有优势
    haochen2
        68
    haochen2  
       2022-05-12 13:58:55 +08:00
    Go 精髓的 goroutine 、channel 你是提都不提啊,教科书一般的标准库没看过吗
    Leviathann
        69
    Leviathann  
       2022-05-12 14:00:07 +08:00
    @Joker123456789
    另一个分支就是默认的 else null
    还可以用 ?: 手动指定另一个分支作为 fallback a?.b()?.c() ?: "fallback“ 前面任意一个为 null 都会直接返回 fallback ,而且这个 fallback 可以是 return

    而且 kotlin 的优势不止是这个,单纯的顺序链式取值使用范围并不广泛,kotlin 的优势在于可以和 scope function 联动,
    a?.let { function(it) }?.c()?.run { this.someMethod() } ?: falllback
    灵活调整 receiver ,这是其他 null safety 语言比不了的
    lisongeee
        70
    lisongeee  
       2022-05-12 14:02:45 +08:00
    @clownpiece

    《没用过 kotlin ,假设 setter 里有通知变更之类的逻辑,那我类内部就是只想修改值不想触发变更能不能实现呢》
    违反了封装性,如果到处是你这种写法,那还要什么维护性?
    你这个 kotlin 也能实现,我增加一个变量去维护状态,setter 被触发的时候判断一下这个然后不走逻辑,直接赋值就行
    但是我从来没有这么做过,我发现我说了优点之后有人好的不谈,专门鸡蛋里挑骨头是吧
    silentsky
        71
    silentsky  
       2022-05-12 14:03:01 +08:00
    @lisongeee 方法和属性类似 这并不是重点,你换成属性也可以,只要属性是 public
    silentsky
        72
    silentsky  
       2022-05-12 14:04:16 +08:00
    @lisongeee 只是想告诉你 java 也可以用这种链式的一行代码搞定,字符多几个无妨
    lisongeee
        73
    lisongeee  
       2022-05-12 14:07:49 +08:00
    @clownpiece 没用过 kotlin ,那就请你去了解一下,我之前就是写 java android 的,现在全用 kotlin 了。
    我有个同事现在经常知道用 lombok 和 setKey()和 getKey(),我拿一端代码 class A{int k=0;} ; A a = new A(); a.k = 0; 给他看,他竟然认为编译不能通过,理由是没有 setA(0),不能更改 a 的值,哈哈哈,我只是说个别现象,没有地图炮哈
    lisongeee
        74
    lisongeee  
       2022-05-12 14:09:42 +08:00
    @silentsky
    人家题主明确说明了《最后来比比 谁的代码少一些。 我敢说,绝对半斤八两,不可能有谁碾压谁的。》
    然后我的评论里是《你这 68 个字符有什么资格碰瓷我 13 个字符???》
    然后你在这说《只是想告诉你 java 也可以用这种链式的一行代码搞定,字符多几个无妨》
    你是不是瞎???
    lisongeee
        75
    lisongeee  
       2022-05-12 14:10:32 +08:00
    @silentsky 建议去写汇编,反正字符多几个无妨
    Buges
        76
    Buges  
       2022-05-12 14:12:57 +08:00 via Android
    来个最经典的快速排序(无需 inplace )
    haskell 代码如下:
    qs [] = []
    qs (p:xs) = qs [x | x<-xs, x<p] ++ [p] ++ qs [x| x<-xs, x>p]

    算法含义一目了然。
    你试试 Java 要几行?
    clownpiece
        77
    clownpiece  
       2022-05-12 14:17:01 +08:00
    @lisongeee 一个类的内部操作还讲封装,真的不想内部绕过去就单独开个类放外面不行吗,总之就是正常写法绕不过去呗
    wolfie
        78
    wolfie  
       2022-05-12 14:17:17 +08:00
    果然 java 是个阿猫阿狗都能踩两脚,以字符个数来踩是没想到的。

    另一个镜像问题,xml 罗嗦,被 json 完爆。
    Oktfolio
        79
    Oktfolio  
       2022-05-12 14:17:22 +08:00   ❤️ 1
    @timpaik 谁让你去用 wrapper 了? maven 不就一个 pom.xml 吗? maven 版本兼容性那可太强了。Gradle 也只有 build.gradle settings.gradle 。还没有 vendor 这种东西。
    lisongeee
        80
    lisongeee  
       2022-05-12 14:21:27 +08:00
    @clownpiece 可以做到,不用原生的 setter 手动写 setKey 和 getKey 即可,

    但是 一个类的内部操作还讲封装,人家 kotlin 的封装是字段级别的,设计哲学就不一样,你偏要这么用?

    还有我 tm 真是服了,我发现我说了优点之后有人好的不谈,专门鸡蛋里挑骨头是吧

    人家题主明确说明了《最后来比比 谁的代码少一些。 我敢说,绝对半斤八两,不可能有谁碾压谁的。》

    老子说的这些优点你们 tm 是一个都不谈哪,真尼玛服了,不去工地抬杠真是可惜了
    lisongeee
        81
    lisongeee  
       2022-05-12 14:23:06 +08:00
    @wolfie

    《果然 java 是个阿猫阿狗都能踩两脚,以字符个数来踩是没想到的。》

    人家题主明确说明了《最后来比比 谁的代码少一些。 我敢说,绝对半斤八两,不可能有谁碾压谁的。》

    比的就是代码量就算字符数量,我不比这个我比什么???
    lawler
        82
    lawler  
       2022-05-12 14:23:32 +08:00
    看到 C#,真的就想笑。C#应该很少年轻人在用了吧?而 35+的程序员应该知道 C#是 Java 的语法糖吧?
    Java -> J# -> C#..
    Java 语法糖系列:C#/JS/Scala/Kotlin..

    Go 生态离 Python 都差一截,语法糖再多都不值一提。

    看来能和 Java 一战的,真的只有 PHP 了...请求 PHPer 前来应战。
    abctt
        83
    abctt  
       2022-05-12 14:24:15 +08:00   ❤️ 2
    @Buges 你可真是牛逼儿,国内主要开发语言时 haskell 的公司麻烦告知一下,或着什么牛逼的项目是这个语言开发的,企业级代码还手写快排,你也真够行的。
    clownpiece
        84
    clownpiece  
       2022-05-12 14:28:27 +08:00
    @lisongeee 那现在一段 java 代码的逻辑就是这样,内部有的操作走 setter 有的直接改字段,用 kotlin 实现反而增加了心智负担没问题吧
    lisongeee
        85
    lisongeee  
       2022-05-12 14:30:44 +08:00
    @clownpiece 我不想和你讨论了,我以前就是写 java 的,我想请你先去学或者了解一下 kotlin ,先了解两种语言再来评价。

    还有我再提醒你一下 人家题主明确说明了《最后来比比 谁的代码少一些。 我敢说,绝对半斤八两,不可能有谁碾压谁的。》

    在这个问题我拒绝和你讨论和代码量无关的话题
    pkwenda
        86
    pkwenda  
       2022-05-12 14:32:53 +08:00
    @aragakiyuii #65 请问这个配色用的 vscode 还是 idea 啊?
    jjwjiang
        87
    jjwjiang  
       2022-05-12 14:34:31 +08:00   ❤️ 1
    别的我印象不深了,但是 java 的 stream 的啰嗦程度是真的相当之高

    collect 就跟画蛇添足一样的感觉,跟泛型一起用太难受了,group 、sort 都是令人发指的反人类

    c#的 linq 和 lambda 可以完爆这一项
    wolfie
        88
    wolfie  
       2022-05-12 14:35:42 +08:00
    @lisongeee
    你家评判一个语言啰不啰嗦是拿代码字符数量比,而不是语法格式来比?
    OP 上面异常捕获就是很好的例子。
    bequt
        89
    bequt  
       2022-05-12 14:35:42 +08:00
    感觉 go 后期也会走 try catch 。。。感受真的很明显
    lisongeee
        90
    lisongeee  
       2022-05-12 14:37:07 +08:00
    @clownpiece 我再额外回复你一条,jetbrains 开发的 kotlin 现在是 google 规定的官方第一开发语言,当然 kotlin 综合生态来比坑定是被 Java 吊锤,你的这些问题应该去问 jetbrains 或者 google 。
    pkwenda
        91
    pkwenda  
       2022-05-12 14:39:43 +08:00
    哈哈我想到一个:go 和 java 启多线程,和线程通信
    lisongeee
        92
    lisongeee  
       2022-05-12 14:40:22 +08:00
    @wolfie 咋了,kotlin 的异常处理和 java 一样的啊,而且还有 try catch 表达式,比起 java ,代码只少不多

    我打扰一下麻烦请您先去了解 kotlin
    silentsky
        93
    silentsky  
       2022-05-12 14:43:33 +08:00   ❤️ 3
    讨论到最后竟然是在比较字符长短,也是够 low
    wolfie
        94
    wolfie  
       2022-05-12 14:44:46 +08:00
    @lisongeee
    感觉你上头到了不仔细看上下文。
    OP 提的 java 跟 go 的异常捕获对比,就是个很好的对比例子。
    lisongeee
        95
    lisongeee  
       2022-05-12 14:46:13 +08:00
    @silentsky

    人家题主明确说明了《最后来比比 谁的代码少一些。 我敢说,绝对半斤八两,不可能有谁碾压谁的。》

    单字符变量名这种不在讨论范围

    然后你在这里说 《讨论到最后竟然是在比较字符长短,也是够 low 》

    瞎???
    lisongeee
        96
    lisongeee  
       2022-05-12 14:48:32 +08:00
    @wolfie 你是不是 xia ,我从始自终一直说的是 kotlin 和 java 的语法产生的代码量多少,我不知道 go ,我也没学过 go ,和 go 有关请不要 @我
    silentsky
        97
    silentsky  
       2022-05-12 14:48:38 +08:00
    你要是拿题主标题说事,题主可只是拿 java 和 go 比,你干嘛要说 kotlin
    xiangyuecn
        98
    xiangyuecn  
       2022-05-12 14:49:54 +08:00
    @Alexliu #16 json 里面取嵌套的对象,不管是 java ,就算是换成 json 的祖宗 js 去读取,一样要判断 null 的情况

    js 这样写够简洁了吧:
    (((json.obj1||{}).obj2||{}).obj3||{}).abc

    换我习惯写的代码:
    ObjGet(ObjGet(ObjGet(json,"obj1"), "obj2"),"obj3").get("abc")
    // ObjGet(map, key) //封装一下 取出 map 里 key 对应的 map ,如果失败就返回一个全新空的 map

    这样写怎么样😂😂😂
    silentsky
        99
    silentsky  
       2022-05-12 14:50:45 +08:00
    真的吵不过喷子 优越感太强了
    Macolor21
        100
    Macolor21  
       2022-05-12 14:51:22 +08:00   ❤️ 3
    Java 啰嗦的点不是包结构这些,还有一大堆设计模式。

    有人吐槽设计模式是 J2EE 出来的产物,不知道“它们”怎么看待 UNIX I/O 的 5 种模型,OSI 7 层模型等。。。

    Java 啰嗦的点在于语法糖太少,没有模式匹配、类型推断这些。

    它是坏处,也是好处。我承认写 Scala 代码很优雅,但同样我也认为它的学习成本略高。

    Java 不断被喷的原因就是,每一行代码都必须清晰的表达用什么类型,做了什么事情,看起来像个啰嗦老太婆,但实际上每一行代码都特别清晰。

    所以 Java 代码不复杂,更容易上手,因为代码清晰。

    可能一部分人为了显得自己与众不同,高人一等,所以它们倾向于学习成本更高,看起来更简练的语言。

    我不认为 Scala ,Groovy, Kotlin 等基于 JVM 的语言是为了此目的而发明出来的。。。
    1  2  3  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2597 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 00:31 · PVG 08:31 · LAX 16:31 · JFK 19:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.