Type Switch with Functional Java 8
package io.github.ikysil.javaplayground.typeswitch;
import javax.swing.*;
import java.util.function.Consumer;
import java.util.function.Supplier;
public class TypeSwitchDemo {
static class TypeSwitch<T> {
private final T instance;
private TypeSwitch(T instance) {
this.instance = instance;
}
static <T> TypeSwitch<T> of(final T instance) {
return new TypeSwitch<>(instance);
}
static <T> TypeSwitch<T> of(final Supplier<T> instanceSupplier) {
return new TypeSwitch<>(instanceSupplier.get());
}
<I> TypeSwitch<T> instanceOf(final Class<I> type, final Consumer<I> consumer) {
if (type.isInstance(instance)) {
consumer.accept(type.cast(instance));
}
return this;
}
void noneMatches(final Consumer<Object> consumer) {
consumer.accept(instance);
}
}
public static void main(String[] args) {
System.out.println("TypeSwitch Demo");
TypeSwitch.of(new JLabel())
.instanceOf(JComponent.class, o -> System.out.println("matched JComponent"));
TypeSwitch.of(new Object())
.instanceOf(JComponent.class, o -> System.out.println("matched JComponent"))
.noneMatches(o -> System.out.printf("none matched: %s of %s%n", o, o.getClass()));
}
}
GitHub Repository: java-playground
Written on May 6, 2020