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
oneisall8955 2022-03-31 18:08:08 +08:00 via Android
@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 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; } |
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 1
至此,没有我认同的最佳答案,相反都是最差的回答。最优不等于语法糖。
|
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; } |
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 我觉得代码的风格应该是一些样式问题,不应该是程序的代码的设计问题,确保程序的流畅运行,有时候你不得不放弃你的风格 选择可以达到效率最高的代码
|