命令型
int A =3;
int B = 3;
int C = A + B * 2; // 9
B = 1;
A, Bが変更されても
Cは変わらない
34.
JavaFXの場合
@FXML
Spinner<Integer> valueA;
@FXML
Spinner<Integer> valueB;
@FXML
LabelvalueC;
private void bind() {
IntegerProperty a = new SimpleIntegerProperty(0);
IntegerProperty b = new SimpleIntegerProperty(0);
NumberBinding c = a.add(b.multiply(2)); // c = a + 2 * b
a.bind(this.valueA.valueProperty());
b.bind(this.valueB.valueProperty());
valueC.textProperty().bind(c.asString());
}
http://aoe-tk.hatenablog.com/entry/2015/07/12/173402
public interface Publisher<T>{
public void subscribe(Subscriber<? super T> s);
}
public interface Subscription {
public void request(long n);
public void cancel();
}
public interface Subscriber<T> {
public void onSubscribe(Subscription s);
public void onNext(T t);
public void onError(Throwable t);
public void onComplete();
}
public interface Processor<T, R> extends
Publisher<T>, Subscriber<R> {}
org.reactivestreams
49.
public interface Publisher<T>{
public void subscribe(Subscriber<? super T> s);
}
public interface Subscription {
public void request(long n);
public void cancel();
}
public interface Subscriber<T> {
public void onSubscribe(Subscription s);
public void onNext(T t);
public void onError(Throwable t);
public void onComplete();
}
public interface Processor<T, R> extends
Publisher<T>, Subscriber<R> {}
org.reactivestreams
BackPressure
実装例 (Publisher)
public classIntPublisher implements Publisher<Integer> {
@Override
public void subscribe(Subscriber<? super Integer> s) {
s.onSubscribe(new Subscription() {
Iterator<Integer> it = IntStream.range(0, 10)
.boxed().iterator();
@Override
public void request(long n) {
for (int i = 0; i < n; i++) {
if (it.hasNext()) {
s.onNext(it.next());
} else {
s.onComplete();
break;
}}}
@Override
public void cancel() {}
});}}
76.
実装例 (Subscriber)public classIntSubscriber implements Subscriber<Integer> {
Subscription subscription;
int req = 1; // AtomicIntegerにすべき
@Override public void onSubscribe(Subscription s) {
subscription = s; s.request(req);
}
@Override public void onNext(Integer integer) {
System.out.println("Next -> " + integer);
if (--req == 0) {
req = new Random().nextInt(10) + 1;
subscription.request(req);
}
}
@Override public void onError(Throwable t) { /**/ }
@Override public void onComplete() {
System.out.println("Complete!");
}
}
77.
使用例
Publisher<Integer> publisher =new IntPublisher();
Subscriber<Integer> subscriber = new IntSubscriber();
publisher.subscribe(subscriber);
// Next -> 1
// Next -> 2
// Next -> 3
// Next -> 4
// Next -> 5
// Next -> 6
// Next -> 7
// Next -> 8
// Next -> 9
// Next -> 10
// Complete!
78.
使用例
Publisher<Integer> publisher =new IntPublisher();
Subscriber<Integer> subscriber = new IntSubscriber();
publisher.subscribe(subscriber);
// Next -> 1
// Next -> 2
// Next -> 3
// Next -> 4
// Next -> 5
// Next -> 6
// Next -> 7
// Next -> 8
// Next -> 9
// Next -> 10
// Complete!
IntPublisher/IntSubscriberは
インターフェースを実装しているだけ
で、実は仕様を満たしていない
(TCKを通らない)
MongoDB
// Bulk Operation
PrintSubscriber<BulkWriteResult>subscriber
= new PrintSubscriber<>("Bulk write results: %s");
collection.bulkWrite(Arrays.asList(
new InsertOneModel<>(new Document("_id", 4)),
new InsertOneModel<>(new Document("_id", 5)),
new InsertOneModel<>(new Document("_id", 6)),
new UpdateOneModel<>(new Document("_id", 1),
new Document("$set", new Document("x", 2))),
new DeleteOneModel<>(new Document("_id", 2)),
new ReplaceOneModel<>(new Document("_id", 3),
new Document("_id", 3).append("x",4))))
.subscribe(subscriber);