2010-05-16 2 views
11

Java 용 Reactive Extensions (.NET)에 해당하는 항목이 있습니까?Reactive Extensions for Java

수신 (반응성 확장)에 대해

수신이 관찰 컬렉션을 사용하는 비동기 및 이벤트 기반 프로그램을 구성하기위한 라이브러리입니다.

저는 JBoss의 Drools과 같은 규칙 엔진을 알고 있지만 Microsoft .NET 접근 방식에 가까운 다른 방법이 있습니까?

답변

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 버전 대신 추상 기본 클래스를 기반으로 할 수 있지만, 그 우아함의 일부를 잃게 : 확장 방법은 훨씬 더 우아하다.

다음은 람다 식과 메서드 그룹 변환입니다. 이것은 일반적으로 LINQ의 근본입니다. Java (익명의 내부 클래스)에서 가장 가까운 클래스는 C#에서 람다 식을 사용하는 모든 곳에서 사용하기에는 너무 추합니다.

기본적으로 Rx의 Java 버전이 가능하지만 C# 버전만큼 우아하지는 않을 것입니다. 이는 내가 알고있는만큼 완료되지 않은 이유 일 것입니다. Java에는 다른 "비동기 구동"라이브러리가있을 수 있지만 Rx처럼 포괄적이고 깔끔하지는 않습니다.

가능함 Java 7의 변경으로 인해 더 실현 가능할 것으로 예상됩니다. 지금까지 ... 내가 확장 방법이 도입되지 않는 알지만, 람다 구문은 괜찮되고 끝나는 경우 추상 기본 클래스 버전 합리적인 것처럼

+0

감사합니다. 자바 7에서 클로저를 사용하는 것이 더 실현 가능할 수도 있습니다. –

+2

이제 이것을 Java로 작성할 수 있습니다. IObservable = source.where (condition()). select (selector()). toArray(); github.com/nicholas22/jpropel-light –

1

당신은 작성, raix (wiki)를 이식하는 것이 좋습니다 ActionScript 3, Java 7 도착시. 이 프로젝트는 오픈 소스이며 호환성을 보장하기 위해 프레임 워크의 .NET 버전에 대한 블랙 박스 단위 테스트를 포함합니다.

Java와 마찬가지로 AS3도 확장 메서드와 람다 식을 모두 지원하지 않으므로 구현이 비슷할 수 있습니다. 그렇지만 AVM이 스레드를 지원하지 않으므로 경쟁 조건에주의해야하므로 RxA에 잠금 코드가 없습니다.

+0

@ richard-szalay, 포인터 주셔서 감사합니다. –

3

아직도 관심이 있으신 분은 최근에 반응 형 및 대화 형 측면에서 대부분의 Rx 운영자를 제공하는 Java library으로 작업하고 있습니다.

.NET만큼 좋지는 않습니다. 자바는 확장 메소드 나 함수 타입이 없기 때문에 모든 것이 정적 메소드와 내부 클래스를 통해 호출되어야한다. 있음.NET :

Observable.Range(0, 10).SelectMany(
    o => Observable.Range(0, o) 
).Run(Console.WriteLine); 

내 라이브러리 : 나는 람다 및 등록 취소에 대한 닫기 가능한 유형 Func0, FUNC1,이 Func2 유형을 사용

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()); 

. 일단 Java가 일류 함수 시민이되면이 FuncX 유형을 간단히 대체 할 수 있습니다. Closeable은 Java 7의 try-with-resources 향상으로 사용할 수 있습니다. 세 번째 추악함은 여러 곳에서 약한 유추 추론 때문입니다.

+1

정적 가져 오기는 가독성을 크게 향상시킬 수 있습니다! – thSoft

18

NetFlix blog post에 따르면, 그들은 Rx를 Java로 이식했습니다. 아직 사용할 수있는 것 같지 않지만 내부적으로 개발 된 오픈 소스 도구를 공개 한 역사가 있기 때문에 결국 공개 될 것으로 기대됩니다.

+11

Netflix의 RxJava는 현재 https://github.com/Netflix/RxJava에서 다운로드 할 수 있습니다. –

1

RxJava (Netflix가 이식 된 RX)는 여기에서 사용할 수 있으며 안정적입니다. https://github.com/ReactiveX/RxJava.

심지어 Java 8의 람다 구문에서도 잘 작동합니다! 다음과 같은 작업을 할 수 있습니다.

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) 

꽤 멋진가?

관련 문제