我需要转换命令行参数及其总和。
public static void main(final String... args) {
final int[] array = Arrays.stream(args).mapToInt(arg -> {
try {
return Integer.parseInt(arg);
} catch (final NumberFormatException nfe) {
System.err.println("wrong arg: " + arg);
}
}).toArray();
final int total = IntStream.of(array).sum();
}
我可以在映射时实际减少(total
)吗?
无论如何,我同时需要array
和total
。
答案 0 :(得分:2)
为什么不这样:
final int total = Arrays.stream(args).mapToInt(arg -> {
try {
return Integer.parseInt(arg);
} catch (final NumberFormatException nfe) {
System.err.println("wrong arg: " + arg);
}
}).sum();
来源:
答案 1 :(得分:1)
有两种方式: 使用流在开头汇总:
int sum =Arrays.stream(args).mapToInt(arg -> {
try {
return Integer.parseInt(arg);
} catch (final NumberFormatException nfe) {
System.err.println("wrong arg: " + arg);
return 0;
}
}).sum();
System.out.print(sum);
或在处理过程中总和:
int sum[] =new int[1];
Arrays.stream(args).mapToInt(arg -> {
try {
return Integer.parseInt(arg);
} catch (final NumberFormatException nfe) {
System.err.println("wrong arg: " + arg);
return 0;
}
})
.peek(value-> sum[0]+=value)
.toArray();
System.out.print(sum[0]);
但第二种选择看起来不太好,我会劝阻你这样做。
答案 2 :(得分:1)
您正在寻找Pair
或Tuple
,遗憾的是 Java 并不支持此功能,也许您可以尝试appache common Pair,有一个例子将reduce
与Pair
一起使用:
ImmutablePair<Integer, List<Integer>> res = Arrays.stream(strings).map(arg -> {
try {
return Integer.parseInt(arg);
} catch (final NumberFormatException nfe) {
System.err.println("wrong arg: " + arg);
throw nfe;
}
}).reduce(ImmutablePair.of(0, new ArrayList<Integer>()), (pair, integer) ->
{
pair.getRight().add(integer);
return ImmutablePair.of(pair.getLeft() + integer, pair.getRight());
}, (pair1, pair2) -> {
pair1.getRight().addAll(pair2.getRight());
return ImmutablePair.of(pair1.getLeft() + pair2.getLeft(), pair1.getRight());
});