Пользовательский коллектор для объединения потока с разделителем, суффиксом и префиксом, только если поток не является пустым суффиксом - PullRequest
0 голосов
/ 12 июня 2019

У меня есть поток строк:

Stream<String> stream = ...;

Я хочу создать строку, используя

stream.collect(Collectors.joining(',', '[', ']'))

только хочувернуть «Нет строк», если поток не содержит никаких элементов.

Я заметил, что метод String java.util.stream.Stream.collect(Collector<? super String, ?, String> collector) принимает аргумент типа java.util.stream.Collector

Для моего проекта IМне нужна эта функциональность во многих местах, поэтому мне нужен класс, реализующий интерфейс Collector.

Я знаю, что это можно сделать с помощью Stream to a List, а затем проверить List.size () == 0?и затем преобразуйте список в поток снова, если это необходимо.

List<String> list = stream.collect(Collectors.toList());

if (list.size() == 0) {
    return "No Strings";
}
return list.stream().collect(Collectors.joining(',', '[', ']'));`

Это то, что я хотел бы, чтобы это произошло

List emptyList = new ArrayList<String>; System.out.println(emptyList.steam().collect(Collectors.joining(',', '[', ']')));

Вывод

[,]

Вывод Я бы хотел

No Strings

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Честно говоря, я бы пошел с вашим текущим подходом (проверка на пустоту).

Но если вы действительно хотите использовать прямой коллектор, вы можете использовать исходный код Collections.joining и Javadoc StringJoiner в качестве руководства для создания пользовательского коллектор:

Collector.of(
    () -> new StringJoiner(",", "[", "]").setEmptyValue("No strings"),
    StringJoiner::add,
    StringJoiner::merge,
    StringJoiner::toString)
0 голосов
/ 12 июня 2019

Я также рекомендовал бы использовать оператор if, который у вас уже есть.Для генерации строки после этого вы также можете использовать String.join():

List<String> list = stream.collect(Collectors.toList());
if (list.isEmpty()) {
    return "No Strings";
}
return "[" + String.join(",", list) + "]";

Если вы не хотите, если вы также можете использовать Optional для предотвращения этого:

return Optional.of(stream.collect(Collectors.toList()))
        .filter(l -> !l.isEmpty())
        .map(l -> "[" + String.join(",", l) + "]")
        .orElse("No Strings");

Но я не думаю, что это более читабельно.

...