使用 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());
}
}
在 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());
}
}