Artem Shpykuliak
Artem Shpykuliak

Reputation: 93

How to replace the method with Java 8 streams?

It can be an obvious question but I am thinking how to replace the method below with java 8 streams.

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

I am new in Java, so java 8 it is like an unexplored world for me.

Thank you!

Upvotes: 8

Views: 1063

Answers (6)

pvpkiran
pvpkiran

Reputation: 27048

This should suffice.

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

EDIT:

Taking Holger's suggestion, this would be even more functional and cleaner.

IntStream.range(0, numberOfCharacters) 
  .map(value -> character) .collect(StringBuilder::new, 
     StringBuilder::appendCodePoint, StringBuilder::append);

Upvotes: 2

Thomas Timbul
Thomas Timbul

Reputation: 1733

Just for "completeness", without apparent loops or Streams:

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

How: Creates a new char array of size 'numberOfCharacters', which will be initialised with 'null' characters. Construct a String from this array, then replace all occurrences of the null character with the desired one.

Upvotes: 1

assylias
assylias

Reputation: 328608

With Java 11+, you could also use String::repeat:

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

Or you could "steal" their implementation:

char[] repeated = new char[numberOfCharacters];
Arrays.fill(repeated, character);
return new String(repeated);

Upvotes: 1

Youcef LAIDANI
Youcef LAIDANI

Reputation: 59978

All you need is just Collections.nCopies

private static String assembleString(int numberOfCharacters, char character) {
    return String.join("",
            Collections.nCopies(numberOfCharacters, String.valueOf(character))
    );
}

Upvotes: 6

Shubhendu Pramanik
Shubhendu Pramanik

Reputation: 2751

Use IntStream:

private String assembleString(int numberOfCharacters, char character) {
        return IntStream.range(0, numberOfCharacters)
               .mapToObj(i -> String.valueOf(character)).collect(Collectors.joining());
    }

Upvotes: 1

Ousmane D.
Ousmane D.

Reputation: 56433

You can use Stream.generate:

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

or IntStream.rangeClosed:

return IntStream.rangeClosed(1, numberOfCharacters)
                .mapToObj(n -> String.valueOf(character))
                .collect(Collectors.joining());

Upvotes: 2

Related Questions