我想简化这个方法,这样我就不需要ArrayList
,也就是说,只有使用lambda,我才能流式传输整数列表,分析谁是偶数或奇数,添加相应的字母并连接成字符串
public static String o1e3method(List<Integer> list) {
List<String> n = new ArrayList<>();
list.forEach(x -> {
if (x % 2 == 0) {
n.add("e" + x);
}
else {
n.add("o" + x);
}
});
return String.join(", ", n);
}
换句话说,我想要的东西是这样的:
public static String o1e3b(List<Integer> list) {
return list.stream()
.map(Object::toString)
.forEach(x -> {
if (Integer.parseInt(x) % 2 == 0) {
x = "e" + x;
}
else {
x = "o" + x;
}
})
.collect(Collectors.joining(", "));
}
但是我不能这样做,因为for每
是一个void
方法,并且不返回要收集的内容。
for每一个
是一个终端操作,它不返回Stream。您需要一个中间操作来转换您的数字并返回转换后的流,稍后您将收集这些流。
请注意,您有一个到String的冗余映射,您根本不需要它。
我会推荐:
public static String o1e3b(List<Integer> list) {
return list.stream()
.map(x -> x % 2 == 0 ? "e" + x : "o" + x)
.collect(Collectors.joining(", "));
}
以防您不熟悉,请参阅什么是三元运算符,我将其用作映射器函数的主体。
您可以简单地将
映射到String:
return list.stream()
.map(x -> x % 2 == 0 ? "e" + x : "o" + x)
.collect(Collectors.joining(", "));
你的想法是对的,但是你应该使用map
而不是for每
。另请注意,没有理由将整数转换为字符串然后再次解析它们:
public static String o1e3b(List<Integer> list) {
return list.stream()
.map(x -> {
if (x %2 == 0) {
return "e" + x;
} else {
return "o" + x;
}
})
.collect(Collectors.joining(", "));
}