Skip to content

Instantly share code, notes, and snippets.

public class Messengers implements ForwardingStream<Rule> {
private final List<Rule> messengerList;
public Messengers(List<Rule> messengers) {
this.messengerList = messengers;
}
@Override
public Stream<Rule> getStream() {
return this.messengerList.stream();
public interface Rule {
OptionalMessenger matches(final String type, final String message);
String getType();
}
public interface Action {
void send(String message);
}
public interface Messenger {
void send(String message);
boolean matches(final String type, final String message);
String getType();
}
public class MessengerClient {
public static void main(String[] args) {
String type = args[0];
String message = args[1];
getMessengers().findMatchingMessenger(type, message).send(type, message);
}
private static Messengers getMessengers() {
public class OptionalMessenger {
private final Optional<Messenger> messenger;
private OptionalMessenger(Optional<Messenger> messenger) {
this.messenger = messenger;
}
public static OptionalMessenger of(Messenger messenger) {
return new OptionalMessenger(Optional.of(messenger));
}
public class Messengers implements ForwardingStream<Messenger> {
private final List<Messenger> messengerList;
public Messengers(List<Messenger> messengers) {
this.messengerList = messengers;
}
@Override
public Stream<Messenger> getStream() {
return this.messengerList.stream();
getMessengers().stream()
.filter(messenger -> messenger.matches(type, message))
.findFirst()
.orElseThrow(
() ->
new MessageSendFailed(
String.format(
"Your message has invalid text or messenger '%s' or not supported.", type)))
.send(message);
public class Admin implements Messenger {
@Override
public boolean matches(final String type, final String message) {
return getType().equalsIgnoreCase(type) && isValid(message);
}
@Override
public String getType() {
return "admin";
public interface Messenger {
void send(String message);
boolean matches(final String type,final String message);
}
public class Hangout implements Messenger {
@Override
public boolean matches(final String type, final String message) {
public static void main(String[] args) {
String type = args[0];
String message = args[1];
getMessengers().stream()
.filter(messenger -> messenger.matches(type, message))
.findFirst()
.orElseThrow(
() ->
new MessageSendFailed(