从 forEach 加入元素
join elements from forEach
我正在创建 SQL SELECT 查询字符串,方法是获取两个列表并并行迭代它们。
List<String> selectFields = new ArrayList<>();
List<String> uuidFunction = new ArrayList<>();
selectFields.add("id");
selectFields.add("name");
uuidFunction.add("UUID_TO_STR");
uuidFunction.add(null);
StringBuilder sql = new StringBuilder("SELECT ");
IntStream.range(0, selectFields.size())
.parallel()
.forEach(i -> {
sql.append(
uuidFunction.get(i) != null ? uuidFunction.get(i) + "(" + selectFields.get(i) + ")"
: selectFields.get(i));
}
);
sql.append(" FROM test_table");
这给了我一个不错的 SQL 字符串,但每个元素之间没有逗号 ,
。
SELECT nameUUID_TO_STR(id)
为什么我不能在 forEach 之后立即使用 .collect(Collectors.joining(","))
?
注意这个问题是我项目中一个更大功能的一部分,我的项目没有使用直接 SQL 准备好的语句。所以请不要提供 SQL 解决这个问题的方法。这是与迭代和附加字符串相关的一般问题。
您无法在 .forEach()
之后收集,因为它是没有 return 值的终端操作 (void
)。因此你不能收集。要使其正常工作,您可以使用以下代码段:
String sql = IntStream.range(0, selectFields.size())
.mapToObj(i -> uuidFunction.get(i) != null
? uuidFunction.get(i) + "(" + selectFields.get(i) + ")"
: selectFields.get(i)
)
.collect(Collectors.joining(", ", "SELECT ", " FROM test_table");
请注意,带有 3 个参数的 joining
重载具有以下签名:
public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,
CharSequence prefix,
CharSequence suffix){...}
我正在创建 SQL SELECT 查询字符串,方法是获取两个列表并并行迭代它们。
List<String> selectFields = new ArrayList<>();
List<String> uuidFunction = new ArrayList<>();
selectFields.add("id");
selectFields.add("name");
uuidFunction.add("UUID_TO_STR");
uuidFunction.add(null);
StringBuilder sql = new StringBuilder("SELECT ");
IntStream.range(0, selectFields.size())
.parallel()
.forEach(i -> {
sql.append(
uuidFunction.get(i) != null ? uuidFunction.get(i) + "(" + selectFields.get(i) + ")"
: selectFields.get(i));
}
);
sql.append(" FROM test_table");
这给了我一个不错的 SQL 字符串,但每个元素之间没有逗号 ,
。
SELECT nameUUID_TO_STR(id)
为什么我不能在 forEach 之后立即使用 .collect(Collectors.joining(","))
?
注意这个问题是我项目中一个更大功能的一部分,我的项目没有使用直接 SQL 准备好的语句。所以请不要提供 SQL 解决这个问题的方法。这是与迭代和附加字符串相关的一般问题。
您无法在 .forEach()
之后收集,因为它是没有 return 值的终端操作 (void
)。因此你不能收集。要使其正常工作,您可以使用以下代码段:
String sql = IntStream.range(0, selectFields.size())
.mapToObj(i -> uuidFunction.get(i) != null
? uuidFunction.get(i) + "(" + selectFields.get(i) + ")"
: selectFields.get(i)
)
.collect(Collectors.joining(", ", "SELECT ", " FROM test_table");
请注意,带有 3 个参数的 joining
重载具有以下签名:
public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,
CharSequence prefix,
CharSequence suffix){...}