是否有任何用于Java的Reactive Extensions(.NET)的等价物?针对Java的反应式扩展
关于的Rx(无扩展)
的Rx是构成使用观察集合异步和基于事件的程序库。
我知道规则引擎,如来自JBOSS的Drools,但是有没有更接近Microsoft .NET方法的其他方法?
是否有任何用于Java的Reactive Extensions(.NET)的等价物?针对Java的反应式扩展
关于的Rx(无扩展)
的Rx是构成使用观察集合异步和基于事件的程序库。
我知道规则引擎,如来自JBOSS的Drools,但是有没有更接近Microsoft .NET方法的其他方法?
我不知道一个的 - 坦白地说这将是很难在这样一个整洁的方式来做。穿线方面很好; Java在线程化方面完全有能力......但目前,该语言不支持相应的功能。
一个LINQ的明快的设计特点是,一切都基于接口,然后扩展方法来添加额外的功能。这允许代码流利地阅读 - 想象如果您必须写:
IObservable<int> = Observable.Select(
Observable.Where(
source, x => x.SomeCondition)
x => x.SomeProjection);
Ick。扩展方法更加优美:
IObservable<int> = source.Where(x => x.SomeCondition)
.Select(x => x.SomeProjection);
现在Java版本可以基于一个抽象基类来代替,但这样会失去一些优雅的。
接下来是lambda表达式和方法组转换 - 这真的是根本LINQ一般; Java中最接近的等价类(匿名内部类)在C#中使用lambda表达式时无处不在。
基本上,Rx的一个Java版本是可行的,但它不会是几乎一样的C#版本一样优雅 - 这可能是为什么它没有被据我所知完成。 Java可能还有其他“异步驱动”库,但它们不可能像Rx那样全面和整齐。
这是可能 Java 7中的变化将使这更可行;据我所知,没有引入扩展方法,而是一个抽象基类,如果lambda语法最终被还好版本将是合理的......
如果你仍然有兴趣,我一直工作在一个Java library最近,它提供了最上的反应和互动侧的Rx运营商也是如此。
这绝对不如.NET。 Java没有扩展方法或函数类型,因此,所有东西都必须通过静态方法和内部类来调用。 In。NET:
Observable.Range(0, 10).SelectMany(
o => Observable.Range(0, o)
).Run(Console.WriteLine);
我的图书馆:
Reactive.run(
Reactive.selectMany(
Reactive.range(0, 10),
new Func1<Observable<Integer>, Integer>() {
public Observable<Integer> invoke(Integer param1) {
return Reactive.range(0, param1);
}
}
), Reactive.println());
Interactive.run(
Interactive.selectMany(
Interactive.range(0, 10),
new Func1<Iterable<Integer>, Integer>() {
public Iterable<Integer> invoke(Integer param1) {
return Interactive.range(0, param1);
}
}
), Interactive.println());
我用Func0,FUNC1,FUNC2类型lambda表达式和关闭类型注销。一旦Java获得头等功能公民,这些FuncX类型可以简单地被替换。 Java 7的“试用资源”增强功能可以使用Closeable。第三个丑陋是由于各地的弱类型推断。
静态导入可以大大提高可读性! – thSoft 2012-05-14 13:15:50
根据此NetFlix blog post,他们已将Rx移植到Java。它似乎还没有可用,但他们确实有开放源代码等内部开发工具的历史,因此我预计它将最终发布。
Netflix的RxJava现已发布在https://github.com/Netflix/RxJava – 2013-02-07 01:12:28
RxJava(RX由Netflix移植)可用并稳定在这里: https://github.com/ReactiveX/RxJava。
它甚至适用于Java 8的lambda语法! 你可以做这样的东西:
Observable
.from(Arrays.asList(1, 2, 3, 4, 5))
.filter(val -> val % 2 == 0)
.map(val -> val * val)
.scan(0, (prev, curr) -> prev + curr)
.subscribe(System.out::println)
很酷一个?
好的,谢谢。也许这在闭包的Java 7中更加可行。 – 2010-05-16 19:26:38
您现在可以在Java中编写此代码:IObservable = source.where(condition())。select(selector())。toArray();请参阅github.com/nicholas22/jpropel-light –
2011-10-08 10:31:39