سؤال

هل هناك أي ما يعادل الامتدادات التفاعلية (.NET) لجافا؟

حول RX (الامتدادات التفاعلية)

RX هي مكتبة لتأليف البرامج غير المتزامنة والقائمة على الأحداث باستخدام مجموعات يمكن ملاحظتها.

أنا على علم بمحركات القواعد مثل سال لعابه من JBOSS ، ولكن هل هناك طريقة أخرى أقرب إلى نهج Microsoft .NET؟

هل كانت مفيدة؟

المحلول

لست على علم بواحد - وبصراحة سيكون من الصعب القيام به بطريقة رائعة. جانب الخيوط على ما يرام. جافا قادرة تمامًا عندما يتعلق الأمر بالخيوط ... ولكن في الوقت الحالي ، لا تدعم اللغة الميزات المناسبة.

تتمثل إحدى ميزات التصميم الأنيقة لـ LINQ في أن كل شيء يعتمد على واجهات ثم يتم استخدام طرق التمديد لإضافة وظائف إضافية. يتيح ذلك للقراءة بطلاقة - تخيل لو كان عليك الكتابة:

IObservable<int> = Observable.Select(
                       Observable.Where(
                           source, x => x.SomeCondition)
                       x => x.SomeProjection);

إيك. طريقة التمديد أكثر رشاقة:

IObservable<int> = source.Where(x => x.SomeCondition)
                         .Select(x => x.SomeProjection);

الآن نسخة جافا يستطع تعتمد على فئة قاعدة مجردة بدلاً من ذلك ، لكن ذلك سيخسر بعض الأناقة.

بعد ذلك ، تعبيرات Lambda وتحويلات مجموعة الأسلوب - فهي أساسية حقًا لـ LINQ بشكل عام ؛ أقرب ما يعادل في Java (فئات داخلية مجهولة) قبيحة جدًا بحيث لا يمكن استخدامها في كل مكان ، يمكنك استخدام تعبير Lambda في C#.

في الأساس ، سيكون إصدار Java من RX ممكنًا ، لكنه لن يكون أنيقًا تقريبًا مثل إصدار C# - وهذا هو السبب في أنه لم يتم ذلك بقدر ما أدرك. قد تكون هناك مكتبات أخرى "لا تتزامن" التي يحركها "لجافا ، لكن من غير المرجح أن تكون شاملة وأنيقة مثل RX.

إنه ممكن أن التغييرات في Java 7 ستجعل هذا أكثر جدوى ؛ بقدر ما أعرف أنه لا يتم تقديم أساليب التمديد ، ولكن إصدار فئة أساسية مجردة سيكون كن معقولًا إذا كان بناء جملة Lambda على ما يرام ...

نصائح أخرى

حسب هذا Netflix Blog Post, ، قاموا بنقل RX إلى Java. لا يبدو أنه متاح بعد ، لكن لديهم تاريخ في إطلاق أدوات مطورة داخليًا مثل المصدر المفتوح ، لذلك أتوقع أن يتم إصداره في النهاية.

إذا كنت لا تزال مهتمًا ، فقد كنت أعمل على مكتبة جافا في الآونة الأخيرة ، والذي يوفر معظم مشغلي RX على الجانب التفاعلي والتفاعلي أيضًا.

إنه بالتأكيد ليس لطيفًا مثل .NET. لا تحتوي Java على طرق تمديد أو أنواع وظائف ، لذلك ، يجب استدعاء كل شيء عبر طريقة ثابتة وفئات داخلية. في الشباك:

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 لـ LAMBDAS ونوع قابلة للإغلاق لعدم التسجيل. بمجرد أن تحصل Java على مواطني وظيفة الدرجة الأولى ، يمكن استبدال أنواع Funcx هذه ببساطة. يمكن استخدامها القابلة للإغلاق من خلال تعزيز جافا 7 مع موارد. القبيح الثالث هو الاستدلال النوع الضعيف في أماكن مختلفة.

Rxjava (Rx الذي تم نقله بواسطة Netflix) متاح ومستقر هنا:https://github.com/reactivex/rxjava.

إنه يعمل حتى مع بناء جملة Java 8's 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)

رائع جدا؟

قد تفكر في النقل رايكس (ويكي) ، مكتوبة في ActionScript 3 ، إلى Java 7 عند وصولها. المشروع (My Own) هو OpenSource ويتضمن اختبارات وحدة الصناديق السوداء لإصدار .NET من الإطار لضمان التوافق.

مثل Java ، لا يدعم AS3 أساليب التمديد أو تعبيرات Lambda ، وبالتالي قد يكون التنفيذ متشابهًا. بعد قولي هذا ، ستحتاج إلى توخي الحذر مع ظروف السباق لأن AVM لا يدعم المواضيع ، لذلك لا يوجد رمز قفل في RXAs.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top