我可以在映射时减少吗?

时间:2017-04-14 09:02:10

标签: java java-8 java-stream

我需要转换命令行参数及其总和。

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)吗?

无论如何,我同时需要arraytotal

3 个答案:

答案 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)

您正在寻找PairTuple,遗憾的是 Java 并不支持此功能,也许您可​​以尝试appache common Pair,有一个例子将reducePair一起使用:

    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());
    });