Как заменить метод с потоками Java 8? - PullRequest
0 голосов
/ 27 июня 2018

Это может быть очевидный вопрос, но я думаю о том, как заменить приведенный ниже метод на потоки Java 8.

private String assembleString(int numberOfCharacters, char character) {
    StringBuilder stringBuilder = new StringBuilder();
    for (int i = 0; i < numberOfCharacters; i++) {
        stringBuilder.append(character);
    }
    return stringBuilder.toString();
}

Я новичок в Java, поэтому java 8 для меня это как неизведанный мир.

Спасибо!

Ответы [ 6 ]

0 голосов
/ 27 июня 2018

Только для «полноты», без видимых циклов или потоков:

private String assembleString(int numberOfCharacters, char character) {
    return new String(new char[numberOfCharacters]).replace('\0', character);
}

How: Создает новый массив символов размера 'numberOfCharacters', который будет инициализироваться с помощью символов 'null'. Создайте строку из этого массива, затем замените все вхождения нулевого символа на нужный.

0 голосов
/ 27 июня 2018

С Java 11+ вы также можете использовать String::repeat:

return String.repeat(Character.toString(character), numberOfCharacters);

Или вы можете «украсть» их реализацию:

char[] repeated = new char[numberOfCharacters];
Arrays.fill(repeated, character);
return new String(repeated);
0 голосов
/ 27 июня 2018

Все, что вам нужно, это просто Collections.nCopies

private static String assembleString(int numberOfCharacters, char character) {
    return String.join("",
            Collections.nCopies(numberOfCharacters, String.valueOf(character))
    );
}
0 голосов
/ 27 июня 2018

Этого должно хватить.

IntStream.range(0, numberOfCharacters)  
  .mapToObj(value -> character)
  .forEach(stringBuilder::append);

EDIT:

Принимая во внимание предложение Хольгера, это было бы еще функциональнее и чище.

IntStream.range(0, numberOfCharacters) 
  .map(value -> character) .collect(StringBuilder::new, 
     StringBuilder::appendCodePoint, StringBuilder::append);
0 голосов
/ 27 июня 2018

Использование IntStream:

private String assembleString(int numberOfCharacters, char character) {
        return IntStream.range(0, numberOfCharacters)
               .mapToObj(i -> String.valueOf(character)).collect(Collectors.joining());
    }
0 голосов
/ 27 июня 2018

Вы можете использовать Stream.generate:

return Stream.generate(() -> String.valueOf(character))
              .limit(numberOfCharacters)
              .collect(Collectors.joining());

или IntStream.rangeClosed:

return IntStream.rangeClosed(1, numberOfCharacters)
                .mapToObj(n -> String.valueOf(character))
                .collect(Collectors.joining());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...