使用 streams().reduce 从 ArrayList<Integer> 构建一个字符串?

Using streams().reduce to build a string from ArrayList<Integer>?

JavaScript 中,我们可以使用 reducer 构建具有其他类型的字符串(例如 num 到 string):

const string = [1,2,3,4,5].reduce((acc,e) => acc += e, "") //"12345"

Java 中,从其他类型构建字符串时,此模式并不容易:

ArrayList<Integer> arrayListOfIntegers = (ArrayList<Integer>) Arrays.asList(1,2,3,4);
String string = arrayListOfIntegers.stream().reduce("", (String acc, Integer e) -> acc += e); // acc += e throws error

错误是:

"Bad return type: String cannot be converted to integer"

这种模式在Java中是不可能的吗?

在Java中,您可以使用Collectors.joining

简单地收集流
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Integer> arrayListOfIntegers = Arrays.asList(1, 2, 3, 4);
        String str = arrayListOfIntegers.stream().map(String::valueOf).collect(Collectors.joining());
        System.out.println(str);
    }
}

输出:

1234

您正在尝试将整数列表缩减为 String。首先将这些整数映射到字符串,然后 reduce:

List<Integer> list = Arrays.asList(1,2,3,4);
String value = list.stream()
                   .map(String::valueOf)
                   .reduce("", String::concat);

您可以使用 String::concat 而不是 (acc,e) -> acc+e。此外,lambda 表达式中的类型不是强制性的。

我建议了这个代码:

public static void main(String[] args) {
    List<Integer> arrayListOfIntegers = Arrays.asList(1,2,3,4);
    String string = arrayListOfIntegers.stream().reduce("",(sum,elm)-> sum += elm.toString(),(sum1,sum2) -> sum1+sum2);
    System.out.println(string);
}

我想最好的方法是使用@Thomas 和@Arvind Kumar Avinash 提供的Collectors.joining。但作为替代解决方案,我建议使用 collect 方法和 StringBuilder class,它不会像 reduce 情况下那样每次都生成新的 String 对象:

List<Integer> list = Arrays.asList(1,2,3,4);
String value = 
       list.stream()
           .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
           .toString();

在其他几个选项中,这是我的贡献,当你有 int 列表时,即原始值,请使用 [IntStream][1] 这是我尝试过的方法。 rangeClosed 包括最后一个数字。 mapToObj是中间操作,collect是终端操作。

import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class SampleIntStream {
    public static void main(String[] args) {
        System.out.println(getComposedString(1, 5));
    }

    public static String getComposedString(int from, int to) {
        return IntStream
                .rangeClosed(from, to)
                .mapToObj(String::valueOf)
                .collect(Collectors.joining());
    }
}