作者:icrochildren1035_175 | 来源:互联网 | 2023-02-01 12:03
1> Vladimir Mat..:
其目的mapMaterializedValue
是在物化后立即转换物化价值.例如,假设您有一个第三方库,它接受这样的回调:
interface Callback {
void onNext(T next);
void onError(Throwable t);
void onComplete();
}
然后,您可以创建一个方法,该方法返回一个Source>
物化值,您可以在实际运行流时立即将其传递给第三方库:
Source> callbackSource() {
return Source.queue(1024, OverflowStrategy.fail())
.mapMaterializedValue(queue -> new Callback {
// an implementation of Callback which pushes the data
// to the queue
});
}
Source> source = callbackSource();
Callback callback = source
.toMat(Sink.foreach(System.out::println), Keep.left())
.run(materializer);
thirdPartyApiObject.runSomethingWithCallback(callback);
您可以在此处看到,这可以简化必须使用此类第三方API的代码,因为您只执行此队列 - >回调转换一次并将其封装在方法中.
但是,在你的情况下,你真的不需要它.您正在使用mapMaterializedValue
物化值完成外部承诺,这完全没有必要,因为您可以直接在物化后使用物化值:
Source> s = Source
.queue(100, OverflowStrategy.fail());
SourceQueueWithComplete queue = source
.toMat(Sink.foreach(x -> System.out.println(x)), Keep.left())
.run(materIalizer);
mapMapperFunction().apply(queue);
没有; 物化价值既不需要是期货(例如,这些例子中的队列不作为未来返回,尽管有些情况下,mat.值是未来),也不是它们与期货"相似" - 唯一这样的相似性是`mapMaterializedValue`和`Future.map`方法名称中的子字符串`map`,这是因为这种转换几乎总是被称为`map`.您可以在我的答案[here](/sf/ask/17360801/#39729078)中找到有关物化值的更多信息.