Как присоединиться при использовании карты с фильтром с потоком - PullRequest
0 голосов
/ 14 июля 2020

Я хочу создать запрос, если getData() вернет "yes". Итак, добавил фильтр для того же самого.

Теперь, если значение getData() равно "yes", тогда я хочу объединить три параметра, которые я получаю от объекта.

Теперь для список объектов, которые я хочу объединить со всем значением, поступающим из

(f -> f.getF()+" "+f.getO()+" "+f.getV())

с «и» в качестве разделителя, но не могу его понять.

String query = data.stream()
    .filter(f -> f.getData().equalsIgnoreCase("yes"))
    .map(f -> f.getF()+" "+f.getO()+" "+f.getV())
    .collect(Collectors.joining(" and","how to do this" , suffix));

например, мы получаем данные от этого объекта как

f.getF () -------- "имя столбца"

f.getO ( ) -------- "="

f.getV () -------- «2»

так Я хочу добавить все условия с помощью разделителя и и создать одну строку со всеми условиями.

Я думаю, что могу добавить «и» в map (), а затем удалить последние «и» из строки

что-то вроде этого

columnname = 2, columnnam1> 1 и column2 = 6

Ответы [ 2 ]

4 голосов
/ 14 июля 2020

Если F - имя столбца, O - оператор, а V - значение, и если вам нужно получить выражение вроде column1 = 1 and column2 > 2 and ..., вам просто нужно использовать Collectors.joining(" and "):

String query = data.stream() // stream1 - original stream of the data collection
    .filter(f -> f.getData().equalsIgnoreCase("yes")) // stream2 - contains only elements with "yes"
    .map(f -> f.getF()+" "+f.getO()+" "+f.getV()) // stream3 - stream of the strings produced by expression f.getF()+" "+f.getO()+" "+f.getV()
    .collect(Collectors.joining(" and "));

Некоторые пояснения. Здесь .collect(Collectors.joining(...)) объединяет элементы потока, созданного предыдущим вызовом .map(f -> f.getF()+" "+f.getO()+" "+f.getV()).

Создано 3 разных потока:

String query = data.stream() // stream1 - original stream of the data collection
    .filter(f -> f.getData().equalsIgnoreCase("yes")) // stream2 - contains only elements with "yes"
    .map(f -> f.getF()+" "+f.getO()+" "+f.getV()) // stream3 - stream of the strings produced by expression f.getF()+" "+f.getO()+" "+f.getV()
    .collect(Collectors.joining(" and","how to do this" , suffix));

Итак, сначала вы присоединяетесь к f.getF(), f.getO() и f.getV() с " " объединителем следующим образом:

.map(f -> f.getF()+" "+f.getO()+" "+f.getV())

Вы получите поток строки вида

"F1 O1 V1",
"F2 O2 V2",
...

К этому потоку присоединится .collect(Collectors.joining(...));. Например, при использовании .collect(Collectors.joining(" and ")); будет получена строка вида

"F1 O1 V1 and F2 O2 V2 and ..."
3 голосов
/ 14 июля 2020

Вы почти достигли цели:

String query = data.stream()
    .filter(f -> f.getData().equalsIgnoreCase("yes"))
    .map(f -> f.getF() + " " + f.getO() + " " + f.getV()))
    .collect(Collectors.joining(" and "));

Результат будет примерно таким:

columnName1 = 2 and columnName2 > 5
...