如何解决使用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());
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。