Skip to content

Instantly share code, notes, and snippets.

@nickebbutt
Last active August 29, 2015 14:09
Show Gist options
  • Save nickebbutt/432f6f3e4a5d5c4cceca to your computer and use it in GitHub Desktop.
Save nickebbutt/432f6f3e4a5d5c4cceca to your computer and use it in GitHub Desktop.
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.logging.Logger;
/**
* Multicast log lines, Java 8, using method references and for each instead of iteration
*/
public class LogMulticasterJava8 {
private List<Consumer<String>> consumers;
public LogMulticasterJava8(Consumer<String>... consumers) {
this.consumers = Arrays.asList(consumers);
}
public void log(String s) {
consumers.forEach(c -> c.accept(s));
}
public static void main(String[] args) {
Logger logger = Logger.getLogger(LogMulticasterJava8.class.getName());
LogMulticasterJava8 logMulticaster = new LogMulticasterJava8(
System.out::println,
logger::info
);
logMulticaster.log("Hello Java 8!!");
}
}
import java.util.logging.Logger;
/**
* Multicast log lines, Java 7, using an interface and anonymous inner classes to wrap the
* actual log destinations as LogDestination
*/
public class LogMulticasterJava7 {
private LogDestination[] consumers;
public LogMulticasterJava7(LogDestination... consumers) {
this.consumers = consumers;
}
public void log(String s) {
for ( LogDestination consumer : consumers) {
consumer.logString(s);
}
}
/**
* Log destinations should implement this interface
*/
public static interface LogDestination {
void logString(String s);
}
public static void main(String[] args) {
Logger logger = Logger.getLogger(LogMulticasterJava8.class.getName());
LogDestination sysOutDestination = new LogDestination() {
@Override
public void logString(String s) {
System.out.println(s);
}
};
LogDestination loggerDestination = new LogDestination() {
@Override
public void logString(String s) {
logger.info(s);
}
};
LogMulticasterJava7 logMulticaster = new LogMulticasterJava7(
sysOutDestination,
loggerDestination
);
logMulticaster.log("Goodbye Java 7!!");
}
}
@nickebbutt
Copy link
Author

This example shows how we can avoid the need to introduce interfaces and anonymous inner classes by passing instead method references as instances of the Consumer functional interface. We can send a String log statement to System.out and to the Logger api despite the fact the method signatures are different, without introducing any boilerplate

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment