Как создать линейную наблюдаемую из InputStream? - PullRequest
0 голосов
/ 05 февраля 2019

Извините за основной вопрос ... У меня есть функция, которая принимает InputStream с содержимым файла и возвращает список объектов, скажем, Person.

Каждая строка входного файла содержитчеловек, поэтому я хочу разобрать его по строке.Ничего сложного, но ... на этот раз я хочу использовать реактивное программирование.

Что-то вроде:

public List<Person> parse(final InputStream is) throws IOException {
    return
    //create an observable wich will split the input in many lines, "\n"
            .map(Person::new)
            .collect(toList());
}

Я пропускаю закомментированный шаг, а именно: создание наблюдаемой, не основанной на байтах, но на основе строки.

1 Ответ

0 голосов
/ 05 февраля 2019

Вы можете создать stream из String, используя метод lines из BufferedReader:

Возвращает Stream, элементы которогостроки читаются из этого BufferedReader.

с кодом, похожим на этот:

Stream<String> lines = new BufferedReader(new InputStreamReader(is, cs)).lines();

Таким образом, ваш код должен выглядеть примерно так:

public List<Person> parse(final InputStream is) throws IOException {
    CharSet cs = ... // Use the right charset for your file
    Stream<String> lines = new BufferedReader(new InputStreamReader(is, cs)).lines();
    return  lines
            .map(Person::new)   
            .collect(toList());
}  
...