IntStream地图功能行为

时间:2018-07-18 13:17:38

标签: java arrays java-8 java-stream

我有一小段代码,用于计算给定数组中正,负和零值的数量。我可以通过遍历数组并计算正值,负值和零值的数量来轻松地使用Java 7。但是对于Java 8流,在map函数中编写条件是否正确?当前,此代码仅迭代一次,并跳过array的其余值。

static void calculatePositiveNegativeAndZero(int[] arr) {
    AtomicInteger positive = new AtomicInteger(0);
    AtomicInteger zero = new AtomicInteger(0);
    AtomicInteger negative = new AtomicInteger(0);
    int len = arr.length;
    Arrays.stream(arr)
            .parallel()
            .map(i -> i > 0 ? positive.getAndIncrement() : (i == 0 ? zero.getAndIncrement() : negative.getAndIncrement()));

    System.out.println(positive.doubleValue()/len);
    System.out.println(negative.doubleValue()/len);
    System.out.println(zero.doubleValue()/len);
}

3 个答案:

答案 0 :(得分:2)

您的流管道中没有终端操作,因此不应执行该操作。您可以使用forEach代替map

Arrays.stream(arr)
        .parallel()
        .forEach(i -> {
             int k = i > 0 ? positive.getAndIncrement() : (i == 0 ? zero.getAndIncrement() : negative.getAndIncrement());
        });

答案 1 :(得分:2)

您可以在不使用AtomicXXX的情况下做同样的事情:

Map<Integer, Long> map = Arrays.stream(arr)
            .boxed()
            .collect(Collectors.groupingBy(
                    Integer::signum,
                    Collectors.counting()));

System.out.println("positive = " + map.get(1) + " negative = " + map.get(-1) + " zero = " + map.get(0));

答案 2 :(得分:0)

您也可以通过创建包装器类来处理此问题。而且您不需要使用AtomicInteger。使用 Java 10 ,我可以通过以下方式弄清楚。

var wrapper = new Object(){ int positive = 0, negative = 0, zero = 0; };
Arrays.stream(arr)
            .parallel()
            .forEach(i -> { int tmp = i > 0 ? wrapper.positive++ : (i == 0 ? wrapper.zero++ : wrapper.negative++);});