Посимвольный консольный ввод через Stream Java 8

312
14 июля 2018, 00:40

Как можно преобразовать консольный ввод System.in в Stream из символов.

Пробовал такую комбинацию:

new BufferedReader(new InputStreamReader(System.in)).lines()

Но проблема что он выдают всю строку, а не поток символов, например я не могу ее обрезать с помощью limit(). Для уточнения скажу что хочу брать из консоли число и превращать его в массив int. Пробовал такой способ, но он так-же берёт числа одним куском и в добавок обрезает нули в начале если они были.

IntStream.of(new Scanner(System.in).nextInt()).limit(4).forEach(System.out::println)

Хотелось бы вытягивать из ввода числа посимвольно с помошью стрима и потом где-то на промежуточном этапе превращать в int и под конец складывать в массив.

Спасибо всем за ответы, решил следующим образом:

int[] inArr = new BufferedReader(new InputStreamReader(System.in))
                .readLine()
                .chars()
                .filter(Character::isDigit)
                .map(Character::getNumericValue)
                .limit(3)
                .toArray();
Answer 1

Можно сделать так:

String str = "hello world";
str
   .chars()
   .mapToObj(e -> (char) e)
   .limit(3)
   .forEach(System.out::println);

Вывод:

h
e
l

Answer 2

В девятке этот вопрос решается элементарно:

int[] ints = new Scanner(System.in)
               .tokens()
               .flatMapToInt(String::chars)
               .filter(Character::isDigit)
               .map(Character::getNumericValue)
               .limit(4)
               .toArray();

В восьмёрке придётся немного извернуться:

public class Example {
    public static Stream<String> scannerStream(Scanner scanner) {
        Spliterator<String> spliterator
          = Spliterators.spliterator(scanner,
                                     Long.MAX_VALUE,
                                     Spliterator.ORDERED | Spliterator.NONNULL);
        return StreamSupport.stream(spliterator, false)
                            .onClose(scanner::close);
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] ints = scannerStream(scanner)
                       .flatMapToInt(String::chars)
                       .filter(Character::isDigit)
                       .map(Character::getNumericValue)
                       .limit(4)
                       .toArray();
        System.out.println(Arrays.toString(ints));
    }
}
READ ALSO
Элементарный пример лямбда выражения

Элементарный пример лямбда выражения

В книге Шилдта приводится элементарный пример использования лямбда-выражения, где метод

269
Как передать один аргумент в метод вместо 3 определенных

Как передать один аргумент в метод вместо 3 определенных

Когда пытаюсь скомпилировать код, вижу такую ошибку: "Expected 3 arguments, but got 1" на мутод "refactorStudent" и "refactorInfo", подскажите как пофикситьДа и вообще,...

295
Как проитерировать объект и получить на выходе новый с Object.keys()

Как проитерировать объект и получить на выходе новый с Object.keys()

У меня есть на входе объект, как вернуть на выходе измененный объект на основе сущствующего?

287