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

问题描述

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

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

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

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

错误是:

错误的返回类型:字符串不能转换为整数”

这种模式在 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,4);
String value = list.stream()
                   .map(String::valueOf)
                   .reduce("",String::concat);

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

,

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

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

我建议使用此代码:

finish()
,

在其他几个选项中,这是我的贡献,当您有 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());
    }
}