Краткий синтаксис потоков - обработка ввода пользователя - PullRequest
0 голосов
/ 25 октября 2019

У меня есть метод, который принимает ввод через сканер, форматирует с помощью toUpperCase и разбивает на пробелы. Также требуется ограничение ввода. Таким образом, только первые N слов появятся в выведенном массиве.

public String[] getMultiLineInput(int inputLimit) 

        String[] input = Arrays.stream(scanner.nextLine().toUpperCase().split("\\s+"))
                .limit(inputLimit)
                .toArray(size -> new String[inputLimit]);

        return input;
    }

Мой метод работает так, как задумано, однако теперь я хотел бы добавить дополнительное условие. Это если строка, полученная функцией scanner.nextline (), меньше предела ввода. Затем он обрежет его еще дальше, чтобы избежать пустых записей в моей строке []

public String[] getMultiLineInput(int inputLimit){

        System.out.println("> ");
        String[] input = Arrays.stream(scanner.nextLine().toUpperCase().split("\\s+"))
                .limit(inputLimit)
                .toArray(size -> new String[inputLimit]);

        ArrayList<String> temp = new ArrayList<>();

        for ( String word : input){
            if ( word != null){
                temp.add(word);
            }
        }

        String [] trimmedarray = temp.toArray(new String[temp.size()]);
        return trimmedarray;

    }

Есть ли более сжатый / эффективный способ сделать это с помощью streams + lamda ( плохо знаком с java 8 * 1008)*) ?. Есть ли способ добавить этот дополнительный шаг в мой поток?

1 Ответ

1 голос
/ 25 октября 2019

При вызове массива не указывайте длину самостоятельно. Вместо этого используйте ссылку на метод, что сделает ваш код еще более читабельным:

public String[] getMultiLineInput(int inputLimit) {
    String[] input = Arrays.stream(scanner.nextLine().toUpperCase().split("\\s+"))
            .limit(inputLimit)
            .toArray(String[]::new);
    return input;
}

Или, как предложил @Naman:

public String[] getMultiLineInput(int inputLimit) {
    return Arrays.stream(scanner.nextLine().toUpperCase().split("\\s+"))
                 .limit(inputLimit)
                 .toArray(String[]::new);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...