Skip to content

Instantly share code, notes, and snippets.

@vandekeiser
Forked from mgandin/FooBar.java
Last active August 29, 2015 14:16
Show Gist options
  • Save vandekeiser/f52c1325b5cab618de3a to your computer and use it in GitHub Desktop.
Save vandekeiser/f52c1325b5cab618de3a to your computer and use it in GitHub Desktop.
package fr.mga.foobarqix;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.IntStream;
import static java.lang.System.out;
import static java.util.Collections.unmodifiableMap;
import static java.util.stream.Collectors.joining;
public class FunctionalFooBarQix {
private static final Map<Integer,String> digitReplacements = digitReplacements();
private static Map<Integer, String> digitReplacements() {
Map<Integer,String> digitReplacements = new HashMap<>();
digitReplacements.put(3,"FOO");
digitReplacements.put(5,"BAR");
digitReplacements.put(7, "QIX");
return unmodifiableMap(digitReplacements);
}
public static String fooBarQix(int number) {
String result = "";
result += digitReplacements.entrySet().stream()
.filter(replacement -> number % replacement.getKey() == 0)
.map(Map.Entry::getValue)
.collect(joining());
result += String.valueOf(number).codePoints()
.mapToObj(Functional::handleDigit)
.collect(joining());
return result.isEmpty() ? String.valueOf(number) : result;
}
/**
* @param digitChar NOT the numeric value of the value, rather the character representing it (
* for instance digitChar=49 represents char '1')
* @return
*/
private static String handleDigit(int digitChar) {
int digit = Character.getNumericValue(digitChar);
return digitReplacements.getOrDefault(digit, "");
}
public static void main(String[] args) {
IntStream.rangeClosed(1, 100)
.mapToObj(Functional::fooBarQix)
.forEach(out::println);
}
}
package fr.mga.foobarqix;
import org.junit.Test;
import java.util.stream.IntStream;
import static org.fest.assertions.api.Assertions.assertThat;
public class FunctionalFooBarQixTest {
@Test
public void should_work_as_ugly_foobarqix() {
IntStream.range(1, 100).forEach(number -> assertThat(
Functional.fooBarQix(number)
).isEqualTo(uglyFooBarQix(number))
);
}
private static String uglyFooBarQix(int i) {
String result = "";
if(i %3 == 0) result += "FOO";
if(i %5 == 0) result += "BAR";
if(i %7 == 0) result += "QIX";
String integer = String.valueOf(i);
for (int j = 0; j < integer.length(); j++) {
char element = integer.charAt(j);
if(element == '3') result += "FOO";
if(element == '5') result += "BAR";
if(element == '7') result += "QIX";
}
return result.isEmpty() ? integer : result;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment