Java Stream:在 reduce() 操作中解析字符串

Java Stream: Parsing Strings inside the reduce() operation

我有一个字符串流:

Stream<String> st = Arrays.stream(new String[]{"10", "20", "30",  "40", "50"});

我想将它们转换为整数并使用 reduce 方法求和。我正在使用以下格式的 reduce:

int result = st.reduce(0, (a, b) -> a + Integer.parseInt(b));

我收到这个错误:

no suitable method found for reduce(int, (a, b) -> a + [...]nt(b))

关于如何重写 reduce 方法以使其工作的任何提示?

您需要提供一个 combiner 函数作为第三个参数才能使其工作:

int sum = Arrays.stream(new String[]{"10", "20", "30",  "40", "50"})
            .reduce(0, (a, b)-> a + Integer.parseInt(b), Integer::sum);

否则你会得到不同风格的 reduce(),它能够产生与流中元素类型相同类型的结果。

而且你不需要reduce(),更好的方法:

int sum = Stream.of("10", "20", "30",  "40", "50")
            .mapToInt(Integer::parseInt)
            .sum();

我不使用 reduce(),而是将其分为两个步骤:将字符串转换为整数(作为 IntStream),然后对它们求和:

Stream.of("10", "20", "30", "40", "50").mapToInt(Integer::parseInt).sum()

I want to convert them to integer and sum them up using the reduce method. I am using reduce in the following format:

当通过 Integer::parseInt 转换为 IntStream 时,reduce 方法采用 int 起始值和 IntBinaryOperator 的形式。所以以下将起作用。

String[] data ={"10", "20", "30",  "40", "50"};
int sum = Arrays.stream(data)
           .mapToInt(Integer::parseInt).reduce(0, (a,b)->(a+b));
System.out.println(sum);

打印

150

为了您的启迪(和未来的需求),您可以这样做。

int sum = Arrays.stream(data).mapToInt(Integer::parseInt).sum();
System.out.println(sum);

打印

150