从forEach加入元素

时间:2018-06-01 13:22:41

标签: java string join java-stream stringbuilder

我正在创建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 String BUT,每个元素之间没有commans ,

  

SELECT nameUUID_TO_STR(id)

为什么我不能在forEach之后立即使用.collect(Collectors.joining(","))

注意此问题是我的项目中更大功能的一部分,其中没有使用直接SQL准备语句。所以请不要提供解决这个问题的SQL方法。这是与迭代和附加字符串相关的一般问题。

1 个答案:

答案 0 :(得分:3)

您无法在.forEach()之后收集,因为它是一个没有返回值的终端操作(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){...}