It's time to finally start learning java 8 api. Recently I needed to modify a string by replacing some characters to randomly generated values. One method for '#' -> random number, one method for '?' -> random lower case letter and one for both replacements. Each char should be processed independently, therefore simply
replaceAll
was not an option. However mapping a stream sounds easy. Unfortunately java doesn't provide CharStream and CharJoiner so it's a bit uglier and less efficient than it should be.
import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
import static org.apache.commons.lang3.RandomStringUtils.randomNumeric;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import com.google.common.base.Preconditions;
public class Replacer {
private String replace(String toReplace, char pattern, Supplier<String> replacementSupplier) {
Preconditions.checkNotNull(toReplace);
return toReplace
.chars()
.mapToObj(c -> c != pattern ? String.valueOf((char)c) : replacementSupplier.get())
.collect(Collectors.joining());
}
public String withLetters(String letterString) {
return replace(letterString, '?', () -> randomAlphabetic(1).toLowerCase());
}
public String withNumbers(String numberString) {
return replace(numberString, '#', () -> randomNumeric(1));
}
public String withBoth(String string) {
return withNumbers(withLetters(string));
}
}
I know this can be done more efficiently using direct operations on ints. But can this be done more efficiently without sacrificing readability? Any suggestions are welcome.
0 komentarze :
Post a Comment