如何在 Java 流中使用 if 语句以避免重复的流处理

0 java lambda functional-programming java-stream

这是我在 Java MOOC.fi 课程中学习流的代码。下面的代码可以工作,但我编写它的方式相当业余。我正在考虑以某种方式将流中的 if 语句与先前输入中给出的答案的条件集成,以通过更改一行(过滤器方法)来预测该过程。有任何想法吗?

System.out.println("Print the average of the negative numbers or the positive numbers? (n/p)");
String answer = scanner.nextLine();
double average;

if (answer.equals("n")) {
    average = inputs.stream()
            .mapToInt(s -> Integer.valueOf(s))
            .filter(pos -> pos < 0)
            .average()
            .getAsDouble();
} else {
    average = inputs.stream()
            .mapToInt(s -> Integer.valueOf(s))
            .filter(pos -> pos > 0)
            .average()
            .getAsDouble();
}
Run Code Online (Sandbox Code Playgroud)

我尝试过forEach,但我不明白如何使用它。我提供给流的集合是一个ArrayList.

我使用的是 Java 11。

Tim*_*sen 5

filter()您可以在选择要使用的比较的步骤中使用包含三元表达式的单个流pos

average = inputs.stream()
                .mapToInt(s -> Integer.valueOf(s))
                .filter(pos -> "n".equals(answer) ? pos < 0 : pos > 0)
                .average()
                .getAsDouble();
Run Code Online (Sandbox Code Playgroud)

  • 我会创建一个变量,以防止每次都评估答案: `IntPredicate filter = "n".equals(answer) ?位置 -&gt; 位置 &lt; 0 : 位置 -&gt; 位置 &gt; 0` (2认同)