Last active
August 29, 2015 14:09
-
-
Save nickebbutt/432f6f3e4a5d5c4cceca to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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!!"); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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!!"); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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