当前位置: 首页 > 知识库问答 >
问题:

IntStream映射函数行为

壤驷志学
2023-03-14

我有一小段代码,用于计算给定数组中的正值、负值和零值的数量。使用Java 7,通过迭代数组并计算正值、负值和零值的数量,我可以轻松地做到这一点。但对于Java 8流,在map函数中写入条件是否正确?目前,此代码只迭代一次,并跳过数组的其余值。

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

艾骏喆
2023-03-14

您还可以通过创建包装器类来处理此问题。您不需要使用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++);});
葛永丰
2023-03-14

您可以用一种不同的方式来做同样的事情,而无需使用原子XXX:

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));
丁光华
2023-03-14

流管道中没有终端操作,因此根本不应该执行它。您可以使用forEach而不是map:

Arrays.stream(arr)
        .parallel()
        .forEach(i -> {
             int k = i > 0 ? positive.getAndIncrement() : (i == 0 ? zero.getAndIncrement() : negative.getAndIncrement());
        });
 类似资料:
  • 以下代码 由IntelliJ转换为: 可以缩短为 这两个流版本不编译。 IntelliJ,暗示值中的i存在问题[i]: 不兼容的类型 必需:int找到:java。lang.对象 编译器抱怨: 错误:(35,17)java:接口java中的方法collect。util。流动IntStream不能应用于给定类型 必需:java。util。作用供应商,爪哇。util。作用ObjIntConsumer,j

  • 映射函数是一组可以连续应用于一个或多个元素列表的函数。 将这些函数应用于列表的结果将放在新列表中,并返回新列表。 例如, mapcar函数处理一个或多个列表的连续元素。 mapcar函数的第一个参数应该是一个函数,其余参数是应用函数的列表。 参数函数应用于导致新构造的列表的连续元素。 如果参数列表的长度不相等,则映射过程在到达最短列表的末尾时停止。 结果列表将具有与最短输入列表相同数量的元素。 例

  • 我们要学习的第一个高阶函数是’映射[map]’.映射是在函数的层次上把一个列表变成相同长度的另一个列表,原始列表中的每一个值,在新的列表中都有一个对应的值。如下所示是一个平方数的映射: map(1,2,3) => (1,4,9) 当然,这只是一个伪代码,一个高阶函数会返回另外一个函数而不是一个列表。那么我们要如何利用RXCollections呢? 我们这么来用rx_mapWithBlock:方法:

  • 我有以下Haskell表达式: 而我也有下面的表达: 我正试图弄清楚上面是否等同于第一个表达式。然而,当我在GHCI中尝试上面的表达式时,我得到了一个错误: 我不知道为什么这个表达不起作用。既然使用了函数组合,那么表达式的计算值不应该是:

  • 我正在结合Lombok和构建器模式使用MapSTRt。我有一个问题,即MapSTRt正在对生成的映射器函数中的所有参数进行显式空检查,并在所有参数为空的情况下提前退出,例如: 我想实现MapStruct不实现完整的空检查。即使所有参数都为null,它也应该设置整个生成器,并在生成器进行null检查(如果有)时调用build。

  • 我试图收集一个列表的结果,并将它们组织成一个地图,其中的值是一个地图: 我得到错误,因为对于列表中的不同值是相同的。 映射中包含的值应为: 当我尝试会删除其中一个条目