diff --git a/2019-08/spring-16/.gitignore b/2019-08/spring-16/.gitignore new file mode 100644 index 00000000..fbe7a1ed --- /dev/null +++ b/2019-08/spring-16/.gitignore @@ -0,0 +1,7 @@ +.idea/ +*.iml + +target/ + +/node_modules +/output diff --git a/2019-08/spring-16/pom.xml b/2019-08/spring-16/pom.xml new file mode 100644 index 00000000..a8c68d2b --- /dev/null +++ b/2019-08/spring-16/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + ru.otus + spring-framework-16 + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.0.3.RELEASE + + + + + io.reactivex.rxjava2 + rxjava + + + com.google.guava + guava + 27.1-jre + + + diff --git a/2019-08/spring-16/src/main/java/ru/otus/CreateExamples.java b/2019-08/spring-16/src/main/java/ru/otus/CreateExamples.java new file mode 100644 index 00000000..285c5d71 --- /dev/null +++ b/2019-08/spring-16/src/main/java/ru/otus/CreateExamples.java @@ -0,0 +1,35 @@ +package ru.otus; + +import io.reactivex.Observable; + +@SuppressWarnings("ResultOfMethodCallIgnored") +public class CreateExamples { + + public static void main(String[] args) { + final Observable obs = deferExample(); + obs.forEach(System.out::println); + obs.forEach(System.out::println); + } + + public static Observable justExample() { + return Observable.just("one", "two", "three"); + } + + public static Observable createExample() { + return Observable.create(emitter -> { + if (emitter.isDisposed()) { + return; + } + emitter.onNext("one"); + emitter.onNext("two");//! + emitter.onNext("three"); + if (!emitter.isDisposed()) { + emitter.onComplete(); + } + }); + } + + public static Observable deferExample() { + return Observable.defer(() -> Observable.just("one", "two", "three")); + } +} diff --git a/2019-08/spring-16/src/main/java/ru/otus/LiveLikeExample.java b/2019-08/spring-16/src/main/java/ru/otus/LiveLikeExample.java new file mode 100644 index 00000000..3f8e31d4 --- /dev/null +++ b/2019-08/spring-16/src/main/java/ru/otus/LiveLikeExample.java @@ -0,0 +1,26 @@ +package ru.otus; + +import io.reactivex.Observable; + +import java.io.IOException; + +public class LiveLikeExample { + + public static void main(String[] args) throws IOException { + + System.in.read(); + } + + static Observable getName() { + return Observable.just("Jake"); + } + + static Observable getSurname() { + return Observable.just("Foo"); + } + + static Observable save(String fullName) { + System.out.println(fullName + " saved!"); + return Observable.just("OK!"); + } +} diff --git a/2019-08/spring-16/src/main/java/ru/otus/OperatorsExample.java b/2019-08/spring-16/src/main/java/ru/otus/OperatorsExample.java new file mode 100644 index 00000000..b98b4a3b --- /dev/null +++ b/2019-08/spring-16/src/main/java/ru/otus/OperatorsExample.java @@ -0,0 +1,75 @@ +package ru.otus; + +import com.google.common.collect.ImmutableList; +import io.reactivex.Observable; +import io.reactivex.ObservableTransformer; +import io.reactivex.Observer; +import io.reactivex.Scheduler; +import io.reactivex.schedulers.Schedulers; +import io.reactivex.subjects.*; + +import java.io.IOException; +import java.time.LocalDate; +import java.util.List; +import java.util.Random; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +public class OperatorsExample { + public static void main(String[] args) throws Exception { + publisherExample(); + System.in.read(); + } + + public static void simpleExample() throws Exception { + List words = ImmutableList.of( + new Person("John", "Dow", "male", LocalDate.of(1992, 3, 12)), + new Person("Jane", "Dow", "female", LocalDate.of(2001, 6, 23)), + new Person("Howard", "Lovecraft", "male", LocalDate.of(1890, 8, 20)), + new Person("Joanne", "Rowling", "female", LocalDate.of(1965, 6, 31))); + Observable.fromIterable(words) + .map(p -> p.getFirstName() + " " + p.getLastName()) + .toList() + .subscribe(System.out::println); + } + + public static void publisherExample() throws Exception { + final Observable ob = magicPublisher(); + System.out.println("First subscribed"); + ob.subscribe(System.out::println); + Thread.sleep(5000); + System.out.println("Second subscribed"); + ob.subscribe(System.out::println); + } + + public static Observable magicPublisher() { + Random r = new Random(1); + AtomicInteger i = new AtomicInteger(); + final Observable obs = Observable.generate(emitter -> + emitter.onNext("" + i.incrementAndGet())) + .concatMap(s -> Observable.just(s).delay(r.nextInt(1000), TimeUnit.MILLISECONDS)) + .subscribeOn(Schedulers.newThread()); + PublishSubject subject = PublishSubject.create(); +// BehaviorSubject subject = BehaviorSubject.create(); +// AsyncSubject subject = AsyncSubject.create(); +// CompletableFuture.runAsync(() -> { +// try { +// Thread.sleep(7000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// subject.onComplete(); +// }); +// ReplaySubject subject = ReplaySubject.create(); + obs.subscribe(subject); + return subject; + } + + //composeExmaple + private static ObservableTransformer filterAndUpperCase() { + return upstream -> upstream + .filter(s -> s.length() >= 4) + .map(String::toUpperCase); + } +} diff --git a/2019-08/spring-16/src/main/java/ru/otus/Person.java b/2019-08/spring-16/src/main/java/ru/otus/Person.java new file mode 100644 index 00000000..72d3f520 --- /dev/null +++ b/2019-08/spring-16/src/main/java/ru/otus/Person.java @@ -0,0 +1,66 @@ +package ru.otus; + +import java.time.LocalDate; +import java.util.Objects; + +public class Person { + private String firstName; + private String lastName; + private String gender; + private LocalDate birth; + + public Person(String firstName, String lastName, String gender, LocalDate birth) { + this.firstName = firstName; + this.lastName = lastName; + this.gender = gender; + this.birth = birth; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public LocalDate getBirth() { + return birth; + } + + public void setBirth(LocalDate birth) { + this.birth = birth; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Person person = (Person) o; + return Objects.equals(firstName, person.firstName) && + Objects.equals(lastName, person.lastName) && + Objects.equals(gender, person.gender) && + Objects.equals(birth, person.birth); + } + + @Override + public int hashCode() { + return Objects.hash(firstName, lastName, gender, birth); + } +} diff --git a/2019-08/spring-16/src/main/java/ru/otus/comparison/AsyncComparison.java b/2019-08/spring-16/src/main/java/ru/otus/comparison/AsyncComparison.java new file mode 100644 index 00000000..5b0b227a --- /dev/null +++ b/2019-08/spring-16/src/main/java/ru/otus/comparison/AsyncComparison.java @@ -0,0 +1,40 @@ +package ru.otus.comparison; + +import io.reactivex.Observable; +import io.reactivex.schedulers.Schedulers; + +import java.io.IOException; + +public class AsyncComparison { + + public static void main(String[] args) throws IOException { + final long timeStarted = System.currentTimeMillis(); + final Observable obs = controller(); + obs.subscribe(System.out::println); + System.out.println("Wait time " + (System.currentTimeMillis() - timeStarted)); + System.in.read(); + } + + static Observable controller() { + return service(); + } + + static Observable service() { + return repository(); + } + + static Observable repository() { + return database(); + } + + static Observable database() { + return Observable.defer(() -> { + try { + Thread.sleep(4000); + } catch (Exception e) { + System.out.println("Don't do this"); + } + return Observable.just("Hello world"); + }).subscribeOn(Schedulers.newThread()); + } +} diff --git a/2019-08/spring-16/src/main/java/ru/otus/comparison/SyncComparison.java b/2019-08/spring-16/src/main/java/ru/otus/comparison/SyncComparison.java new file mode 100644 index 00000000..c2bf7077 --- /dev/null +++ b/2019-08/spring-16/src/main/java/ru/otus/comparison/SyncComparison.java @@ -0,0 +1,31 @@ +package ru.otus.comparison; + +public class SyncComparison { + + public static void main(String[] args) { + final long timeStarted = System.currentTimeMillis(); + System.out.println(controller()); + System.out.println(System.currentTimeMillis() - timeStarted); + } + + static String controller() { + return service(); + } + + static String service() { + return repository(); + } + + static String repository() { + return database(); + } + + static String database() { + try { + Thread.sleep(4000); + } catch (Exception e) { + System.out.println("Don't do this"); + } + return "Hello world"; + } +}