объединить элементы из forEach - PullRequest
0 голосов
/ 01 июня 2018

Я создаю строку запроса 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 НО без запятых , между каждым элементом.

ВЫБРАТЬ имяUUID_TO_STR (id)

Почему я не могу использовать .collect(Collectors.joining(",")) сразу после forEach?

ПРИМЕЧАНИЕ. Эта проблема является частью большей проблемы.функция в моем проекте, где не используются прямые подготовленные операторы SQL.Поэтому, пожалуйста, не предоставляйте SQL способ решения этой проблемы.Это общая проблема, связанная с итерациями и добавлением строк.

1 Ответ

0 голосов
/ 01 июня 2018

Вы не можете собрать после .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");

Обратите внимание, что перегрузка joining с 3 параметрами имеет следующую подпись:

public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,
                                                         CharSequence prefix,
                                                         CharSequence suffix){...}
...