Java 语言代码实现一个最优写法。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
godleon
V2EX    程序员

Java 语言代码实现一个最优写法。

  •  
  •   godleon 2022-03-31 16:49:06 +08:00 5334 次点击
    这是一个创建于 1339 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求

    JAVA 语言, 提供一个静态方法接收动态 Integer 参数,把接收到所有 Integer 不为 Null 的相加 返回总和。

    支持 stream ,需要一个最优的写法! 可以评论一下,看看大佬们的代码功底!让我这个菜鸟采纳一下~

    50 条回复    2022-04-01 11:28:50 +08:00
    Leviathann
        1
    Leviathann  
       2022-03-31 16:52:58 +08:00
    动态 Integer 参数
    指的是 vararg ?
    dcsuibian
        2
    dcsuibian  
       2022-03-31 16:53:44 +08:00
    reduce
    godleon
        3
    godleon  
    OP
       2022-03-31 16:55:25 +08:00
    @Leviathann 就是调一次这个方法可以传入 N 个 Integer
    BiChengfei
        4
    BiChengfei  
       2022-03-31 16:59:54 +08:00
    ```
    @Test
    public void test022() {
    System.out.println(count(1, 2, 3, 4, 5));
    }

    public int count(int... input) {
    return Arrays.stream(input).sum();
    }
    ```
    这个可以吗
    BiChengfei
        5
    BiChengfei  
       2022-03-31 17:00:53 +08:00
    静态就自己加个 static
    privatetan
        6
    privatetan  
       2022-03-31 17:01:04 +08:00
    你是来白嫖代码的吧
    godleon
        7
    godleon  
    OP
       2022-03-31 17:03:36 +08:00
    @BiChengfei 差不多了 ,你这个差一个非空效验,可以写

    return Arrays.stream(input).mapToInt(n -> (n != null ? n : 0)).sum();

    这个应该算挺优了
    micean
        8
    micean  
       2022-03-31 17:07:40 +08:00
    少了并行计算
    BiChengfei
        9
    BiChengfei  
       2022-03-31 17:07:54 +08:00
    @godleon 入参用的 int ,不可能为 null
    godleon
        10
    godleon  
    OP
       2022-03-31 17:08:37 +08:00
    @BiChengfei 需求就是 Integer
    gitdoit
        11
    gitdoit  
       2022-03-31 17:10:33 +08:00
    public static void main(String[] args) {
    System.out.println(sum(1,2,4,null,3,5));
    }
    public static int sum(Integer ... number) {
    return Stream.of(number).filter(Objects::nonNull).reduce(0, Integer::sum);
    }
    BiChengfei
        12
    BiChengfei  
       2022-03-31 17:12:34 +08:00
    @godleon 基本类型自动拆箱,方法入参你可以写成 Integer
    count(new Integer(1), new Integer(2), new Integer(3))
    godleon
        13
    godleon  
    OP
       2022-03-31 17:18:01 +08:00
    @gitdoit 老哥稳
    Cbdy
        14
    Cbdy  
       2022-03-31 17:19:32 +08:00
    public static int sumInt(@Nullable Integer @NotNull ... ints) {
    var sum = 0;
    for (var it : ints) {
    if (it != null) {
    sum += it;
    }
    }
    return sum;
    }
    anzu
        15
    anzu  
       2022-03-31 17:57:41 +08:00
    如果只有 null ,我是说 Integer[] arr = null; 的情况
    所有上来就用 stream 的必报错,让你们优雅,哈哈哈
    itechify
        16
    itechify  
    PRO
       2022-03-31 18:08:08 +08:00 via Android
    @anzu 那为什么不反思下 null 时候要调呢,接口定义可以协定不处理 null 的。
    这到底是调用者还是被调用者的问题?
    Leviathann
        17
    Leviathann  
       2022-03-31 18:11:59 +08:00
    @anzu 什么意思,vararg 哪来的 null?
    Saxton
        18
    Saxton  
       2022-03-31 18:12:33 +08:00
    方法几百种,没有什么最优的,只有最适合你的自己的,可能你写的这个别人认为这里不行,别人写的你认为那里不行,每个人有每个人的写作风格。
    FrankHB
        19
    FrankHB  
       2022-03-31 18:17:15 +08:00
    ?现在 Java 普及了 Babel 类似物了么?不卡源语言版本的?
    (要能用 transpiler 一般也是全体 JVM 语言,用不着特指 Java 。)
    yazinnnn
        20
    yazinnnn  
       2022-03-31 18:18:05 +08:00
    fun sum(vararg array: Int?): Int {
    return array.filterNotNull().fold(0) { acc, i -> acc + i }
    }
    molicloud
        21
    molicloud  
       2022-03-31 18:20:03 +08:00   1
    accuracy 的值越大,精确度越高

    public static long sum(Integer ... numbers) throws InterruptedException {
    long accuracy = 1000L;
    long startTime = System.currentTimeMillis();
    for (Integer number : numbers) {
    Thread.sleep(number * accuracy);
    }
    return (System.currentTimeMillis() - startTime) / accuracy;
    }
    yazinnnn
        22
    yazinnnn  
       2022-03-31 18:26:48 +08:00
    kotlin 对 Int 的集合做了优化,直接这样就行

    fun sum(vararg array: Int?): Int {
    return array.filterNotNull().sum()
    }
    lululau
        23
    lululau  
       2022-03-31 18:27:00 +08:00
    IntStream.of(1, 2, 3).filter(Objects::nonNull).sum()
    yazinnnn
        24
    yazinnnn  
       2022-03-31 18:30:49 +08:00
    fun sum(vararg array: Int?): Int {
    return array.sumOf { it?:0 }
    }
    Red998
        25
    Red998  
       2022-03-31 18:32:05 +08:00
    List<Integer> objects = Lists.newArrayList();
    objects.stream().filter(Objects::nonNull).mapToInt(Integer::intValue).sum();
    zzh7982
        26
    zzh7982  
       2022-03-31 18:38:00 +08:00
    private static int sum(Integer... i){
    return Arrays.stream(i).filter(Objects::nonNull).mapToInt(x -> x).sum();
    }
    Cbdy
        27
    Cbdy  
       2022-03-31 18:47:13 +08:00
    @Leviathann 你好,有可能为 null 的
    hepin1989
        28
    hepin1989  
       2022-03-31 19:29:51 +08:00
    for 循环效率最高
    hepin1989
        29
    hepin1989  
       2022-03-31 19:35:49 +08:00
    import java.util.Objects._
    def sum(ints:Int *):Int = ints.filter(nonNull).sum

    sum(1,2,3,4)
    hepin1989
        30
    hepin1989  
       2022-03-31 19:36:10 +08:00
    hepin1989
        31
    hepin1989  
       2022-03-31 19:38:12 +08:00
    def sum(ints:Int *):Int =
    (for(intValue <- ints if intValue ne null) yield intValue).sum
    pengtdyd
        32
    pengtdyd  
       2022-03-31 19:39:55 +08:00
    我记得阿里巴巴 java 开发手册里面有这么一句话,调用者应该负责参数的校验,谁调用谁负责,所以有 null 应该由调用者处理吧
    hepin1989
        33
    hepin1989  
       2022-03-31 19:43:32 +08:00
    def sum(ints:Integer *):Int =
    ints.foldLeft(0)((a, b) => if (b eq null) a else a + b)
    Leviathann
        34
    Leviathann  
       2022-03-31 19:44:43 +08:00
    @Cbdy void func(Integer ...args) { System.out.println(args.toString()); }

    直接 func() 调用都没问题,args 不可能为 null ,怎么导致 stream 报错

    如果是直接传一个 null 参数,那在调用的地方就爆了和函数里面用什么方法处理也没关系
    hepin1989
        35
    hepin1989  
       2022-03-31 19:45:45 +08:00
    public static BigInteger sum(Integer ... ints) {
    BigInteger sum = BigInteger.ZERO;
    for (Integer anInt : ints) {
    if (anInt != null) {
    sum = sum.add(BigInteger.valueOf(anInt));
    }
    }
    return sum;
    }
    anzu
        36
    anzu  
       2022-03-31 20:17:43 +08:00
    @Leviathann 你确定?这里输出 args is null 后报错

    public class MyClass {
    public static void main(String args[]) {
    Integer[] arr = null;
    func(arr);
    }
    static void func(Integer ...args) {
    if (args == null) {
    System.out.println("args is null");
    }
    System.out.println(args.toString());
    }
    }
    Leviathann
        37
    Leviathann  
       2022-03-31 20:29:43 +08:00
    @anzu 的确 我看走眼了,回去翻了下 jshell 运行记录,由于函数体偷懒没写,而调用时那一长串文字原来是警告不是异常,
    再次说明 2022 年还在使用一门连空安全都做不到的语言实在是浪费生命
    Cbdy
        38
    Cbdy  
       2022-03-31 20:29:53 +08:00
    @Leviathann 36L 给出了可能为 null 的情况,我在 14L 给给出了我的答案,你可以注意一下到我加的两个注解
    lawler
        39
    lawler  
       2022-03-31 22:50:26 +08:00   1
    至此,没有我认同的最佳答案,相反都是最差的回答。最优不等于语法糖。
    lawler
        40
    lawler  
       2022-03-31 22:50:33 +08:00   1
    public static int sum(Integer num, Integer... nums) {
    int result = num == null ? 0 : num;
    for (int i = 0; i < (nums == null ? 0 : nums.length); i++) {
    result += sum(nums[i]);
    }
    return result;
    }
    sumulige
        41
    sumulige  
       2022-03-31 22:57:47 +08:00
    @privatetan 人家问个问题就白嫖了?
    douyacai911
        42
    douyacai911  
       2022-04-01 00:25:44 +08:00 via iPhone
    代码不会写,但 采纳 这词不是这样用的吧
    resol341
        43
    resol341  
       2022-04-01 02:59:23 +08:00
    @douyacai911 你不要不识抬举
    arvinsilm
        44
    arvinsilm  
       2022-04-01 08:51:35 +08:00
    你们能不能加个 Markdown 代码格式
    aguesuka
        45
    aguesuka  
       2022-04-01 09:45:52 +08:00
    mapToInt(x -> x).sum() 比 reduce(0, Integer::sum) 好
    mapToInt(Integer::intValue) 比 mapToInt(x -> x) 好
    filter(Objects::nonNull) 比 n != null ? n : 0 好
    sum(Integer ... numbers) 比 sum(Integer num, Integer... nums) 好, 因为过滤 null 后的加法是阿贝尔群, 允许无参返回单位元很合理
    不考虑参数数组为 null 比数组为 null 返回 0 好
    循环比一定比 stream 好, 因为 stream 可以方便地使用多线程
    aguesuka
        46
    aguesuka  
       2022-04-01 09:46:54 +08:00
    @aguesuka "循环比一定比 stream 好" -> "循环不一定比 stream 好"
    Bigglesworth
        47
    Bigglesworth  
       2022-04-01 10:23:33 +08:00
    @douyacai911 #42 应该笑纳
    intmax2147483647
        48
    intmax2147483647  
       2022-04-01 11:06:27 +08:00
    什么牛鬼蛇神的评论区
    godleon
        49
    godleon  
    OP
       2022-04-01 11:25:28 +08:00
    @Saxton 每个人有每个人的风格不错,但是在绝对的实力面前你的风格显得黯然失色!
    godleon
        50
    godleon  
    OP
       2022-04-01 11:28:50 +08:00
    @Saxton 我觉得代码的风格应该是一些样式问题,不应该是程序的代码的设计问题,确保程序的流畅运行,有时候你不得不放弃你的风格 选择可以达到效率最高的代码
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2213 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 01:04 PVG 09:04 LAX 17:04 JFK 20:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86