If simplification
First if can be simplified to input % 15
. Basically you are checking for number divisible by 3 and 5, so you can just check for 15. I agree with using brackets even here as mentioned by @Captain Man
public String pickOne(int input) {
if (input % 15 == 0) {
return "fizzbuzz";
} else if (input % 3 == 0) {
return "fizz";
} else if(input % 5 == 0) {
return "buzz";
}
return String.valueOf(input);
}
Constructing the string from pieces
You can reduce one if by removing "else" conditions. Downside is, that you need to add another if
in the end for the return values so probably not better, but should be mentioned:
public String pickOneV2(int input) {
var sb = new StringBuilder();
if (input % 3 == 0) {
sb.append("fizz");
}
if (input % 5 == 0) {
sb.append("buzz");
}
if (sb.length() == 0) {
return String.valueOf(input);
}
return sb.toString();
}
Data-oriented approach
With all if conditions being in the same format, you can extract this into a data structure and simplify your code even more. I kept the map in the same method for simplicity reasons, but in reality it should be class property or a constant. This is the most extensible and clean I can think of, and you can easily modify this functionality purely by modifying the data without touching your code.
public String pickOneV3(int input) {
var fizzbuzzMap = new TreeMap<Integer, String>(Comparator.reverseOrder());
fizzbuzzMap.put(3, "fizz");
fizzbuzzMap.put(5, "buzz");
fizzbuzzMap.put(15, "fizzbuzz");
for (var index : fizzbuzzMap.keySet()) {
if (input % index == 0) {
return fizzbuzzMap.get(index);
}
}
return String.valueOf(input);
}
Using stream API
Slightly nicer version (imho) using streams:
public String pickOneV4(int input) {
return fizzbuzzMap.entrySet().stream().filter(
entry -> input % entry.getKey() == 0
).map(Map.Entry::getValue).findFirst().orElse(String.valueOf(input));
}