2010-05-16 57 views

回答

11

我不知道一个的 - 坦白地说这将是很难在这样一个整洁的方式来做。穿线方面很好; 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语法最终被还好版本是合理的......

+0

好的,谢谢。也许这在闭包的Java 7中更加可行。 – 2010-05-16 19:26:38

+2

您现在可以在Java中编写此代码:IObservable = source.where(condition())。select(selector())。toArray();请参阅github.com/nicholas22/jpropel-light – 2011-10-08 10:31:39

1

你可能会考虑移植raixwiki),写在ActionScript 3,到达Java 7时。该项目(我自己的)是开源的,并包含.NET框架的黑盒单元测试以确保兼容性。

Java一样,AS3既不支持扩展方法也不lambda表达式,从而实现可能是相似的。话虽如此,由于AVM不支持线程,所以在RxAs中没有锁定代码,因此您需要注意竞争条件。

+0

@ richard-szalay,感谢您的指点。 – 2010-06-04 06:25:06

3

如果你仍然有兴趣,我一直工作在一个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。第三个丑陋是由于各地的弱类型推断。

+1

静态导入可以大大提高可读性! – thSoft 2012-05-14 13:15:50

18

根据此NetFlix blog post,他们已将Rx移植到Java。它似乎还没有可用,但他们确实有开放源代码等内部开发工具的历史,因此我预计它将最终发布。

+11

Netflix的RxJava现已发布在https://github.com/Netflix/RxJava – 2013-02-07 01:12:28

1

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) 

很酷一个?