如何在字符串对象上使用Java 8 forEach来对值进行编码?



我正在尝试使用Java 8 ForEach编写以下内容来编码字符串数组。

public static void encode(String... stringsToEncode) {
for (int i = 0; i < stringsToEncode.length; i++) {
stringsToEncode[i] = URLEncoder.encode(stringsToEncode[i], "UTF-8");
}
}
// stringsToEncode = 10+111569+++8 as expected.

我已经实现了以下内容:

public static void encodeUsingForEach(String... stringsToEncode)
List<String> listOfStrings = Arrays.asList(stringsToEncode);
listOfStrings.forEach(s -> {
try {
s = URLEncoder.encode(s, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new AssertionError("UTF-8 is unknown");
}
});
}
// listOfStrings = [10 11, 156, 9   8]

我缺少什么,以便 encodeUsingForEach(( 的输出等效于 encode(( 方法的输出?

不能使用forEach()替换值,因为它只消耗对象而不返回它们。lambda 内部的重新赋值实际上没有任何作用,因为在 Java 中,参数是按值传递的。相反,请尝试使用流来映射值并生成新列表:

List<String> listOfStrings = Arrays.stream(stringsToEncode)
.map(s -> {
try {
return URLEncoder.encode(s, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new AssertionError("UTF-8 is unknown");
}
})
.collect(Collectors.toList());

在lambda表达式中,s是列表的成员之一,列表指向内存中的该位置。因此,如果 s 是一个对象并且您更改了其中的某些字段,那么每件事都会以正确的方式进行,但现在您正在替换存储在 s 中的对象的地址而不在列表中更新。因此,通过进行此替换,您只会失去参考。

最新更新