├── .gitignore
├── README.md
├── Reactive.pptx
├── license
├── pom.xml
└── src
└── main
└── java
└── com
└── vgrazi
├── observable
├── EmitterLauncher.java
├── Launcher.java
├── MetronomeLauncher.java
└── WordLauncher.java
├── play
├── BufferThrottleExample.java
├── ConnectedPublisherExamples.java
├── Examples.java
├── GeneralCodeSamples.java
├── MapFlatMapExamples.java
├── MathExamples.java
├── PriceTick.java
├── SomeFeed.java
├── SomeListener.java
└── reactive.java
└── util
└── Utils.java
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by .ignore support plugin (hsz.mobi)
2 | ### Maven template
3 | target/
4 | pom.xml.tag
5 | pom.xml.releaseBackup
6 | pom.xml.versionsBackup
7 | pom.xml.next
8 | release.properties
9 | dependency-reduced-pom.xml
10 | buildNumber.properties
11 | .mvn/timing.properties
12 |
13 | .gitignore
14 | .idea/
15 | reactive.iml
16 | Reactive play/reactive (1).iml
17 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # rxjava-snippets
2 | Reactive rx-java code snippets
3 |
4 | There are three launchers representing the examples in our article. Just do a maven install of the project and launch the main of each:
5 |
6 | 1. WordLauncher - The "quick brown fox" example
7 | 2. MetronomeLauncher - Merging the two streams to produce a clock that varies every 15 seconds
8 | 3. EmitterLauncher - Emits stock feeds. These are randomly generated, don't go out and buy or sell based on this!!
9 |
10 | The other examples in the various testers are random reactive examples
11 |
--------------------------------------------------------------------------------
/Reactive.pptx:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/license:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2016 Victor J Grazi
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | com.vgrazi.play
8 | reactive
9 | 1.0.0-SNAPSHOT
10 |
11 |
12 |
13 | org.apache.maven.plugins
14 | maven-compiler-plugin
15 |
16 | 1.8
17 | 1.8
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 | io.reactivex
26 | rxjava
27 | 1.1.10
28 |
29 |
30 | io.reactivex
31 | rxjava-math
32 | RELEASE
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | junit
41 | junit
42 | RELEASE
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/src/main/java/com/vgrazi/observable/EmitterLauncher.java:
--------------------------------------------------------------------------------
1 | package com.vgrazi.observable;
2 |
3 | import com.vgrazi.play.PriceTick;
4 | import com.vgrazi.play.SomeFeed;
5 | import com.vgrazi.play.SomeListener;
6 | import rx.AsyncEmitter;
7 | import rx.Observable;
8 | import rx.observables.ConnectableObservable;
9 |
10 | import static com.vgrazi.util.Utils.sleep;
11 |
12 | public class EmitterLauncher {
13 | public static void main(String[] args) {
14 | SomeFeed feed = new SomeFeed<>();
15 | Observable obs =
16 | Observable.fromEmitter((AsyncEmitter emitter) ->
17 | {
18 | SomeListener listener = new SomeListener() {
19 | @Override
20 | public void priceTick(PriceTick event) {
21 | emitter.onNext(event);
22 | if (event.isLast()) {
23 | emitter.onCompleted();
24 | }
25 | }
26 |
27 | @Override
28 | public void error(Throwable e) {
29 | emitter.onError(e);
30 | }
31 | };
32 | feed.register(listener);
33 | }, AsyncEmitter.BackpressureMode.BUFFER);
34 |
35 | ConnectableObservable hotObservable = obs.publish();
36 | hotObservable.connect();
37 |
38 | hotObservable.take(10).subscribe((priceTick) ->
39 | System.out.printf("1 %s %4s %6.2f%n", priceTick.getDate(),
40 | priceTick.getInstrument(), priceTick.getPrice()));
41 |
42 | sleep(1_000);
43 |
44 | hotObservable.take(10).subscribe((priceTick) ->
45 | System.out.printf("2 %s %4s %6.2f%n", priceTick.getDate(),
46 | priceTick.getInstrument(), priceTick.getPrice()));
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/src/main/java/com/vgrazi/observable/Launcher.java:
--------------------------------------------------------------------------------
1 | package com.vgrazi.observable;
2 |
3 | import rx.Observable;
4 |
5 | import java.util.Date;
6 | import java.util.concurrent.TimeUnit;
7 |
8 | import static com.vgrazi.util.Utils.isSlowTime;
9 | import static com.vgrazi.util.Utils.sleep;
10 |
11 | public class Launcher
12 | {
13 |
14 | public static void main(String[] args)
15 | {
16 | new Launcher().launch();
17 | }
18 |
19 | private void launch()
20 | {
21 | Observable slow = Observable.interval(2, TimeUnit.SECONDS);
22 | Observable fast = Observable.interval(1, TimeUnit.SECONDS);
23 | Observable.merge(
24 | slow.filter(x->isSlowTime()),
25 | fast.filter(x->!isSlowTime())
26 | )
27 | .subscribe(x-> System.out.println(new Date()))
28 | ;
29 |
30 | sleep(50_000);
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/java/com/vgrazi/observable/MetronomeLauncher.java:
--------------------------------------------------------------------------------
1 | package com.vgrazi.observable;
2 |
3 | import rx.Observable;
4 |
5 | import java.util.Date;
6 | import java.util.concurrent.TimeUnit;
7 |
8 | import static com.vgrazi.util.Utils.isSlowTime;
9 | import static com.vgrazi.util.Utils.sleep;
10 |
11 | public class MetronomeLauncher
12 | {
13 |
14 | public static void main(String[] args)
15 | {
16 | new MetronomeLauncher().launch();
17 | }
18 |
19 | private void launch()
20 | {
21 | Observable fast = Observable.interval(1, TimeUnit.SECONDS);
22 | Observable slow = Observable.interval(2, TimeUnit.SECONDS);
23 | final int[] i = {1};
24 | Observable.merge(
25 | fast.filter(x -> !isSlowTime()),
26 | slow.filter(x -> isSlowTime())
27 | )
28 | .subscribe(x -> System.out.println(i[0]++ + " " + new Date()))
29 | ;
30 | sleep(50_000);
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/java/com/vgrazi/observable/WordLauncher.java:
--------------------------------------------------------------------------------
1 | package com.vgrazi.observable;
2 |
3 | import rx.Observable;
4 |
5 | import java.util.Arrays;
6 | import java.util.List;
7 |
8 | public class WordLauncher
9 | {
10 |
11 | public static void main(String[] args)
12 | {
13 | new WordLauncher().launch();
14 | }
15 |
16 | private void launch()
17 | {
18 | List words = Arrays.asList(
19 | "the",
20 | "quick",
21 | "brown",
22 | "fox",
23 | "jumped",
24 | "over",
25 | "the",
26 | "lazy",
27 | "dogs"
28 | );
29 |
30 | Observable.from(words)
31 | .flatMap(word -> Observable.from(word.split("")))
32 | .distinct()
33 | .sorted()
34 | .zipWith(Observable.range(1, Integer.MAX_VALUE),
35 | (string, count)->String.format("%2d. %s", count, string))
36 | .subscribe(System.out:: println);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/main/java/com/vgrazi/play/BufferThrottleExample.java:
--------------------------------------------------------------------------------
1 | package com.vgrazi.play;
2 |
3 | import org.junit.Test;
4 | import rx.Observable;
5 | import rx.Subscriber;
6 | import rx.Subscription;
7 | import rx.functions.Func0;
8 | import rx.functions.Func1;
9 |
10 | import javax.swing.*;
11 | import java.awt.*;
12 | import java.awt.event.MouseAdapter;
13 | import java.awt.event.MouseEvent;
14 | import java.awt.event.MouseMotionAdapter;
15 | import java.awt.event.MouseMotionListener;
16 | import java.util.Collections;
17 | import java.util.Date;
18 | import java.util.List;
19 | import java.util.concurrent.TimeUnit;
20 |
21 | /**
22 | * Created by victorg on 8/2/2016.
23 | */
24 | public class BufferThrottleExample {
25 | private final JPanel panel = new JPanel();
26 | @Test
27 | public void mouseClickTest() throws InterruptedException {
28 | JFrame frame = new JFrame();
29 | frame.setBounds(100, 100, 500, 500);
30 | frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
31 | JLabel label = new JLabel("Test");
32 | panel.add(label);
33 | panel.setBackground(Color.yellow);
34 | frame.getContentPane().add(panel);
35 | frame.setVisible(true);
36 |
37 | Observable mouseObservable = Observable.create(subscriber -> {
38 | panel.addMouseListener(new MouseAdapter() {
39 | @Override
40 | public void mouseClicked(MouseEvent e) {
41 | subscriber.onNext(String.format("Clicked at %d, %d", e.getX(), e.getY()));
42 | }
43 | });
44 | });
45 |
46 | Subscription subscription = mouseObservable
47 | .debounce(400, TimeUnit.MILLISECONDS)
48 | // .window(400, TimeUnit.MILLISECONDS)
49 | // .toList()
50 | .doOnNext((x) -> System.out.println(new Date() + x.toString()))
51 | // .filter(list -> !list.isEmpty())
52 | // .map(list -> list.get(list.size() - 1))
53 | .subscribe((text) -> label.setText(text.toString()));
54 | Thread.sleep(10_000);
55 | }
56 |
57 | @Test
58 | public void mouseMoveTest() throws InterruptedException {
59 | JFrame frame = new JFrame();
60 | frame.setBounds(100, 100, 500, 500);
61 | frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
62 | JLabel label = new JLabel("Test");
63 | panel.add(label);
64 | panel.setBackground(Color.yellow);
65 | frame.getContentPane().add(panel);
66 | frame.setVisible(true);
67 |
68 | Observable observable = Observable.create(subscriber -> {
69 | panel.addMouseMotionListener(new MouseMotionListener() {
70 | @Override
71 | public void mouseDragged(MouseEvent e) {
72 | subscriber.onNext(String.format("Dragged to %d, %d", e.getX(), e.getY()));
73 | }
74 |
75 | @Override
76 | public void mouseMoved(MouseEvent e) {
77 | subscriber.onNext(String.format("Moved to %d, %d", e.getX(), e.getY()));
78 | }
79 | });
80 | });
81 |
82 | observable.buffer(new Func0>() {
83 | @Override
84 | public Observable call() {
85 | return Observable.just(new Date() + " Hit");
86 | }
87 | })
88 | .doOnNext(System.out::println)
89 | .debounce(500, TimeUnit.MILLISECONDS)
90 | .subscribe(System.out::println);
91 |
92 | // observable.buffer(100, TimeUnit.MILLISECONDS)
93 | // .doOnNext(System.out::println)
94 | // .filter(list -> !list.isEmpty())
95 | // .map(list -> list.get(list.size() - 1))
96 | // .subscribe(label::setText);
97 | Thread.sleep(100_000);
98 | }
99 | @Test
100 | public void test() throws InterruptedException {
101 | Observable.interval(100, TimeUnit.MILLISECONDS)
102 | .buffer(Observable.interval(500, TimeUnit.MILLISECONDS))
103 | .doOnNext(System.out::println)
104 | .map(Collections::max)
105 | .subscribe(System.out::println);
106 |
107 | Thread.sleep(100_000);
108 |
109 | }
110 | }
111 |
--------------------------------------------------------------------------------
/src/main/java/com/vgrazi/play/ConnectedPublisherExamples.java:
--------------------------------------------------------------------------------
1 | package com.vgrazi.play;
2 |
3 | import rx.Observable;
4 | import rx.Subscription;
5 | import rx.observables.ConnectableObservable;
6 |
7 | import java.util.concurrent.TimeUnit;
8 |
9 | /**
10 | * Created by victorg on 7/28/2016.
11 | */
12 | public class ConnectedPublisherExamples {
13 |
14 | public static void main(String[] args) throws Exception{
15 | // Observable hotObservable = Observable.interval(1, TimeUnit.SECONDS);
16 | ConnectableObservable hotObservable = Observable.interval(1, TimeUnit.SECONDS).publish();
17 |
18 | // hotObservable.refCount();
19 | hotObservable.autoConnect(2);
20 | // hotObservable.autoConnect(2, s->System.out.println(s + " connected"));
21 | Subscription subscriber1 = hotObservable.subscribe(val -> System.out.println("Subscriber 1 >> " + val));
22 |
23 | Thread.sleep(4000);
24 |
25 | Subscription subscriber2 = hotObservable.subscribe(val -> System.out.println("Subscriber 2 >> " + val));
26 | // Thread.sleep(1000);
27 | // subscriber1.unsubscribe();
28 |
29 | // Thread.sleep(1000);
30 | // subscriber2.unsubscribe();
31 | //
32 | // hotObservable.connect();
33 |
34 | Thread.sleep(50_000);
35 | }
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/src/main/java/com/vgrazi/play/Examples.java:
--------------------------------------------------------------------------------
1 | package com.vgrazi.play;
2 |
3 | import java.util.Date;
4 |
5 | public class Examples {
6 | public static void main(String[] args) {
7 | // SomeFeed feed = new SomeFeed<>();
8 | //
9 | // Observable observable =
10 | // Observable.fromAsync((AsyncEmitter emitter) -> {
11 | // SomeListener listener = new SomeListener() {
12 | // @Override
13 | // public void priceTick(PriceTick event) {
14 | // emitter.onNext(event);
15 | // if (event.isLast()) {
16 | // emitter.onCompleted();
17 | // }
18 | // }
19 | //
20 | // @Override
21 | // public void error(Throwable e) {
22 | // emitter.onError(e);
23 | // }
24 | // };
25 | //
26 | // feed.register(listener);
27 | // }, AsyncEmitter.BackpressureMode.BUFFER);
28 | //
29 | //
30 | // observable.subscribe(x -> System.out.printf("%2d %s %4s %6.2f%n", x.getSequence(), x.getDate(), x.getInstrument(), x.getPrice()), System.out::println, () -> System.out.println("Complete"));
31 | // Observable range = Observable.range(1, Integer.MAX_VALUE);
32 | // Observable words = Observable.just(
33 | // "the",
34 | // "quick",
35 | // "brown",
36 | // "fox",
37 | // "jumped",
38 | // "over",
39 | // "the",
40 | // "lazy",
41 | // "dog"
42 | // );
43 | // words.
44 | // flatMap(w -> Observable.from(w.split("")))
45 | // .distinct()
46 | // .sorted()
47 | // .zipWith(Observable.range(1, Integer.MAX_VALUE), (letter, counter) -> String.format("%2d. %s", counter, letter))
48 | // .subscribe(System.out::println);
49 | //
50 | // Observable weekday = Observable.interval(5, TimeUnit.SECONDS)
51 | // .filter(x -> isWeekend());
52 | //
53 | // Observable weekend = Observable.interval(2, TimeUnit.SECONDS)
54 | // .filter(x -> !isWeekend());
55 | //
56 | // Observable.merge(weekend, weekday)
57 | // .subscribe(x -> System.out.println(new Date()));
58 | //
59 | // sleep(100_000);
60 | }
61 |
62 |
63 | private static boolean isWeekend() {
64 | Date now = new Date();
65 | return now.getSeconds() > 30;
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/src/main/java/com/vgrazi/play/GeneralCodeSamples.java:
--------------------------------------------------------------------------------
1 | package com.vgrazi.play;
2 |
3 | import org.junit.Test;
4 | import rx.*;
5 | import rx.Observable;
6 | import rx.functions.Action0;
7 | import rx.functions.Action1;
8 | import rx.observables.ConnectableObservable;
9 | import rx.observables.MathObservable;
10 | import rx.schedulers.Schedulers;
11 | import rx.subjects.AsyncSubject;
12 | import rx.subjects.Subject;
13 |
14 | import java.io.IOException;
15 | import java.util.*;
16 | import java.util.concurrent.*;
17 |
18 | public class GeneralCodeSamples {
19 |
20 | @Test
21 | public void testCreate() {
22 | Observable.create(s -> s.onNext("Hello, world"))
23 | .subscribe(System.out::println);
24 |
25 | }
26 |
27 | @Test
28 | public void testCreateTwo() {
29 | Observable.create(
30 | subscriber -> {
31 | subscriber.onNext("Hello,");
32 | subscriber.onNext("World");
33 | }
34 | )
35 | .subscribe(System.out::println);
36 |
37 | }
38 |
39 | @Test
40 | public void testCreateWithComplete() {
41 | Observable.create(
42 | subscriber -> {
43 | subscriber.onNext("Hello,");
44 | subscriber.onNext("World");
45 | subscriber.onCompleted();
46 | }
47 | )
48 | .subscribe(System.out::println, System.out::println, () -> System.out.println("Complete"));
49 |
50 | }
51 |
52 | @Test
53 | public void testCreateWithError() {
54 | Observable