Kotlin to the rescue
fold the universe: reduction with java 8 streams API
DomainEvents.kt
@file:JvmName("DomainEvents")
interface DomainEvent {
val type: Class<out DomainEvent>
get() = this.javaClass
}
class CounterCreatedEvent : DomainEvent
class CounterIncrementedEvent : DomainEvent
class CounterDecrementedEvent : DomainEvent
fun Aggregate.apply(event: DomainEvent): Aggregate = when (event) {
is CounterCreatedEvent -> this.on(event)
is CounterIncrementedEvent -> this.on(event)
is CounterDecrementedEvent -> this.on(event)
else -> throw IllegalStateException("unexpected unsupported domain event occur: $event")
}
Some.java
Optional<Aggregate> foldLeft(Aggregate initialState, DomainEvent... events) {
if (events.length <= 0) return Optional.empty();
Aggregate accumulator = initialState;
for (DomainEvent event : events)
accumulator = DomainEvents.apply(accumulator, event);
return Optional.of(accumulator);
}
./gradlew clean test