在Java 8中使用当前流方法中的Stream方法

Aph*_*hex 2 java java-8 java-stream

我有一组整数,我想计算max()我的流包含的整数数量.该max()方法来自Stream API.

我想要这样的事情

int count = Arrays.stream(myIntArray)
            .filter(i -> i == max())
            .count();
System.out.printf("Count: %d", count);
Run Code Online (Sandbox Code Playgroud)

我无法max()从我的forEach()方法中调用该方法,因为这不是Streams的功能 - 所以我该怎么做才能使它工作?

Lou*_*man 10

你不能做这样的事情,不是没有很多麻烦.编写所需内容的最简单方法是两个阶段:

int max = Arrays.stream(array).max().getAsInt();
int count = (int) Arrays.stream(array).filter(i -> i == max).count();
Run Code Online (Sandbox Code Playgroud)

如果你坚持一次性做,我会写一些类似的东西

int[] maxAndCount = Arrays.stream(array).collect(
    () -> new int[2], // first max, then count
    (maxAndCount, i) -> {
      if (i > maxAndCount[0] || maxAndCount[1] == 0) {
        maxAndCount[0] = i;
        maxAndCount[1] = 1;
      } else if (i == maxAndCount[0]) {
        maxAndCount[1]++;
      }
    },
    (maxAndCount1, maxAndCount2) -> {
      if (maxAndCount1[0] < maxAndCount2[0]) {
        maxAndCount1[0] = maxAndCount2[0];
        maxAndCount1[1] = maxAndCount2[1];
      } else if (maxAndCount1[0] == maxAndCount2[0]) {
        maxAndCount1[1] += maxAndCount2[1];
      }
    });
  int count = maxAndCount[1];
Run Code Online (Sandbox Code Playgroud)

...但老实说,简单的两阶段版本很难被击败.(坦率地说,我希望它表现得更好.)

  • @JacobG.读取[`Arrays.stream(int [])`]的返回类型(https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#stream-int:A- ) (3认同)
  • 向上投票,但我仍然认为你应该使用`orElse(0)`. (2认同)