2. ABOUT ME
▸ Android developer since 2008
▸ Lead Android Engineer @ 90Seconds.tv
▸ Kotlin and Rx addict
▸ RxKotlin contributor
▸ RxDataBindings author
4. 1.0 VS 2.0
▸ Mar 2018 - end of rxJava1 support
▸ Better performance
▸ Lower memory consumption
▸ Can’t use null
▸ Reactive-Streams based
▸ Maybe, Flowable
5. OBSERVABLE AND FRIENDS
▸ Flowable: 0..N flows, supporting Reactive-Streams and
backpressure
▸ Observable: 0..N flows, no backpressure
▸ Single: a flow of exactly 1 item or an error
▸ Completable: a flow without items but only a completion
or error signal
▸ Maybe: a flow with no items, exactly one item or an error
6. HOW TO DEAL WITH NULLS
▸ Null object pattern
▸ Optional
▸ State wrappers
7. NULL OBJECT PATTERN
interface Animal {
void makeSound();
}
class Dog implements Animal {
public void makeSound() {
System.out.println("woof!");
}
}
enum NullAnimal implements Animal {
INSTANCE;
public void makeSound() {};
}
void execute() {
List<Animal> animals = Arrays.asList(NullAnimal.INSTANCE, new Dog());
Observable.fromIterable(animals)
.filter(animal J> animal != NullAnimal.INSTANCE)
.subscribe(AnimalKLmakeSound);
}
8. STREAM OF OPTIONAL VALUES
interface Animal {
void makeSound();
}
class Dog implements Animal {
public void makeSound() {
System.out.println("woof!");
}
}
public void execute() {
List<Optional<Animal>> animals = Arrays.asList(
Optional.<Animal>empty(), Optional.of(new Dog())
);
Observable.fromIterable(animals)
.filter(OptionalKLisPresent)
.map(OptionalKLget)
.subscribe(AnimalKLmakeSound);
}
9. STREAM OF STATES
class AnimalStateSuccess implements AnimalState {
Animal animal;
AnimalStateSuccess(Animal animal) { this.animal = animal; }
@Override public boolean hasAnimal() { return true;}
@Override public Animal animal() { return animal; }
@Override public String errorMsg() { return null; }
}
enum AnimalStateError implements AnimalState {
INSTANCE;
@Override public boolean hasAnimal() { return false;}
@Override public Animal animal() { return null; }
@Override public String errorMsg() { return "We lost him"; }
}
public void execute() {
List<AnimalState> animals = Arrays.asList(
AnimalStateError.INSTANCE, new AnimalStateSuccess(new Dog())
);
Observable.fromIterable(animals)
.filter(AnimalStateKLhasAnimal)
.map(AnimalStateKLanimal)
.subscribe(AnimalKLmakeSound);
}
11. BLOCKING CALLS
Observable<Integer> observable = Observable.just(1, 2);
int first = observable.blockingFirst();
assertEquals(first, 1);
int last = observable.blockingLast();
assertEquals(last, 2);
Iterable<Integer> integers = observable.blockingIterable();
int sum = 0;
for (Integer integer : integers) sum += integer;
assertEquals(sum, 3);