Как считать первый токен разделенной строки, используя потоки Java 8 - PullRequest
0 голосов
/ 30 мая 2018

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

//result is List<String>
for(String elem:result) {
    if(elem.contains(".")) {
        elem = elem.split("\\.")[0];
    }
}

в стиле потока Java 8 .. Как я могу это сделать?

что ядо сих пор пробовал:

result.stream().map(String::split("\\.")[0]);

но это дает ошибку компиляции, а также я не знаю, как обработать условие

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Не компилируйте шаблон для каждого элемента (через split), но создайте его перед циклом.Также кажется, что вы хотите получить новый список в результате, что-то вроде:

 Pattern p = Pattern.compile("\\.");
 List<String> out = result
            .stream()
            .map(x -> p.splitAsStream(x).findFirst().orElse(x))
            .collect(Collectors.toList());

С другой стороны, если вы хотите сделать это на месте:

 result.replaceAll(x -> p.splitAsStream(x).findFirst().orElse(x));
0 голосов
/ 30 мая 2018

Поскольку split() возвращает всю строку, если разделителя нет, вам не нужен if, и вы можете безопасно применить преобразование ко всем элементам.

Вы можете заменить весь свой кодтолько с этим:

result.replaceAll(s -> s.split("\\.")[0]);

——

На самом деле, вам также не нужно разделять: вы можете использовать String#replaceAll(), чтобы удалить все с первой точки вперед вместо разделения:

result.replaceAll(s -> s.replaceAll("\\..*", ""));

Вызов replaceAll("\\..*", "") не является операцией, если в строке нет точки.

0 голосов
/ 30 мая 2018

Если вы хотите список строк (как вы говорите в комментарии к коду), то это то, что вы хотите.Тем не менее, ваш текущий код только устанавливает elem на last значение, соответствующее contains.Он не создает список.

List<String> elems = result.stream()
    .filter(elem -> elem.contains("."))
    .map(elem -> elem.split("\\.")[0])
    .collect(Collectors.toList());

Причина, по которой он не компилируется result.stream().map(String::split("\.")[0]), заключается в том, что это недопустимый синтаксис для ссылки на метод.Круглые скобки после ссылки на метод String::split(/*anything*/) всегда недопустимы.

См. учебник Oracle по ссылкам на методы для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...