
JAVA 语言, 提供一个静态方法接收动态 Integer 参数,把接收到所有 Integer 不为 Null 的相加 返回总和。
支持 stream ,需要一个最优的写法! 可以评论一下,看看大佬们的代码功底!让我这个菜鸟采纳一下~
1 Leviathann 2022-03-31 16:52:58 +08:00 动态 Integer 参数 指的是 vararg ? |
2 dcsuibian 2022-03-31 16:53:44 +08:00 reduce |
3 godleon OP @Leviathann 就是调一次这个方法可以传入 N 个 Integer |
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(); } ``` 这个可以吗 |
5 BiChengfei 2022-03-31 17:00:53 +08:00 静态就自己加个 static |
6 privatetan 2022-03-31 17:01:04 +08:00 你是来白嫖代码的吧 |
7 godleon OP @BiChengfei 差不多了 ,你这个差一个非空效验,可以写 return Arrays.stream(input).mapToInt(n -> (n != null ? n : 0)).sum(); 这个应该算挺优了 |
8 micean 2022-03-31 17:07:40 +08:00 少了并行计算 |
9 BiChengfei 2022-03-31 17:07:54 +08:00 @godleon 入参用的 int ,不可能为 null |
10 godleon OP @BiChengfei 需求就是 Integer |
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); } |
12 BiChengfei 2022-03-31 17:12:34 +08:00 @godleon 基本类型自动拆箱,方法入参你可以写成 Integer count(new Integer(1), new Integer(2), new Integer(3)) |
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; } |
15 anzu 2022-03-31 17:57:41 +08:00 如果只有 null ,我是说 Integer[] arr = null; 的情况 所有上来就用 stream 的必报错,让你们优雅,哈哈哈 |
16 itechify PRO @anzu 那为什么不反思下 null 时候要调呢,接口定义可以协定不处理 null 的。 这到底是调用者还是被调用者的问题? |
17 Leviathann 2022-03-31 18:11:59 +08:00 @anzu 什么意思,vararg 哪来的 null? |
18 Saxton 2022-03-31 18:12:33 +08:00 方法几百种,没有什么最优的,只有最适合你的自己的,可能你写的这个别人认为这里不行,别人写的你认为那里不行,每个人有每个人的写作风格。 |
19 FrankHB 2022-03-31 18:17:15 +08:00 ?现在 Java 普及了 Babel 类似物了么?不卡源语言版本的? (要能用 transpiler 一般也是全体 JVM 语言,用不着特指 Java 。) |
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 } } |
21 molicloud 2022-03-31 18:20:03 +08:00 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; } |
22 yazinnnn 2022-03-31 18:26:48 +08:00 kotlin 对 Int 的集合做了优化,直接这样就行 fun sum(vararg array: Int?): Int { return array.filterNotNull().sum() } |
23 lululau 2022-03-31 18:27:00 +08:00 IntStream.of(1, 2, 3).filter(Objects::nonNull).sum() |
24 yazinnnn 2022-03-31 18:30:49 +08:00 fun sum(vararg array: Int?): Int { return array.sumOf { it?:0 } } |
25 Red998 2022-03-31 18:32:05 +08:00 List<Integer> objects = Lists.newArrayList(); objects.stream().filter(Objects::nonNull).mapToInt(Integer::intValue).sum(); |
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(); } |
27 Cbdy 2022-03-31 18:47:13 +08:00 @Leviathann 你好,有可能为 null 的 |
28 hepin1989 2022-03-31 19:29:51 +08:00 for 循环效率最高 |
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) |
30 hepin1989 2022-03-31 19:36:10 +08:00 <script src="https://scastie.scala-lang.org/TPI4eIIsQmukOvwOzh0FSQ.js"></script> |
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 |
32 pengtdyd 2022-03-31 19:39:55 +08:00 我记得阿里巴巴 java 开发手册里面有这么一句话,调用者应该负责参数的校验,谁调用谁负责,所以有 null 应该由调用者处理吧 |
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) |
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 参数,那在调用的地方就爆了和函数里面用什么方法处理也没关系 |
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; } |
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()); } } |
37 Leviathann 2022-03-31 20:29:43 +08:00 @anzu 的确 我看走眼了,回去翻了下 jshell 运行记录,由于函数体偷懒没写,而调用时那一长串文字原来是警告不是异常, 再次说明 2022 年还在使用一门连空安全都做不到的语言实在是浪费生命 |
38 Cbdy 2022-03-31 20:29:53 +08:00 @Leviathann 36L 给出了可能为 null 的情况,我在 14L 给给出了我的答案,你可以注意一下到我加的两个注解 |
39 lawler 2022-03-31 22:50:26 +08:00 至此,没有我认同的最佳答案,相反都是最差的回答。最优不等于语法糖。 |
40 lawler 2022-03-31 22:50:33 +08:00 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; } |
41 sumulige 2022-03-31 22:57:47 +08:00 @privatetan 人家问个问题就白嫖了? |
42 douyacai911 2022-04-01 00:25:44 +08:00 via iPhone 代码不会写,但 采纳 这词不是这样用的吧 |
43 resol341 2022-04-01 02:59:23 +08:00 @douyacai911 你不要不识抬举 |
44 arvinsilm 2022-04-01 08:51:35 +08:00 你们能不能加个 Markdown 代码格式 |
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 可以方便地使用多线程 |
47 Bigglesworth 2022-04-01 10:23:33 +08:00 @douyacai911 #42 应该笑纳 |
48 intmax2147483647 2022-04-01 11:06:27 +08:00 什么牛鬼蛇神的评论区 |
50 godleon OP @Saxton 我觉得代码的风格应该是一些样式问题,不应该是程序的代码的设计问题,确保程序的流畅运行,有时候你不得不放弃你的风格 选择可以达到效率最高的代码 |