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

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

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

    需求

    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 的必报错,让你们优雅,哈哈哈
    oneisall8955
        16
    oneisall8955  
       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   ·   实用小工具   ·   1121 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:47 · PVG 07:47 · LAX 15:47 · JFK 18:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.