2017-01-12 10 views
1

Фильтр в следующем коде пытается отфильтровать нечетные числа, но не могу компилировать код, поскольку он жалуетсяфильтра наблюдаемый не может применяться к булевым функциям в Rxjava 2

Ошибка: (114, 25) Ошибка: несовместимые типы:> не могут быть преобразованы в предикат

Было нормально, когда я использовал rxjava 1 с Func1, как я могу заставить его работать с rxjava 2?

List<Integer> ints = new ArrayList<>(); 
    for (int i=1; i<10; i++) { 
     ints.add(new Integer(i)); 
    } 
    Log.d("RxFlapmapActivity", "flapMapEx2 1,2,3,4,5,6,7,8,9"); 
    Observable.just(ints) 
      .flatMap(new Function<List<Integer>, Observable<Integer>>() { 
       @Override 
       public Observable<Integer> apply(List<Integer> ints) { 
        return Observable.fromIterable(ints); 
       } 
      }) 
      .filter(new Function<Integer, Boolean>() { 
       @Override 
       public Boolean apply(Integer integer) { 
        Log.d("RxFlapmapActivity", "flapMapEx2222222 filter out odd numbers........."); 
        return integer.intValue() % 2 == 0; 
       } 
      }) 
      .flatMap(new Function<Integer, Observable<Integer>>() { 
       @Override 
       public Observable<Integer> apply(Integer integer) { 
        for (int i = 0; i < 1000000000; i++) { 
        } 
        return multiplyInt(integer, 2); 
       } 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Observer<Integer>() { 
       @Override 
       public void onSubscribe(Disposable d) { 

       } 
       @Override 
       public void onComplete() { 
       } 
       @Override 
       public void onError(Throwable e) { 
        e.printStackTrace(); 
       } 
       @Override 
       public void onNext(Integer integer) { 
        Log.d("RxFlapmapActivity", "flapMapEx2 onNext>>>" + integer.toString()); 
       } 
      }); 

ответ

3

Это может быть легко собран с retrolambda или java8

List<Integer> ints = new ArrayList<>(); 
    for (int i=1; i<10; i++) { 
     ints.add(i); 
    } 

    Log.d("RxFlapmapActivity", "flapMapEx2 1,2,3,4,5,6,7,8,9"); 
    Observable.just(ints) 
      .flatMap(Observable::fromIterable) 
      .filter(integer -> integer % 2 == 0) 
      .flatMap(integer -> { 
       for (int i = 0; i < 1000000000; i++) { 
       } 

       return multiplyInt(integer, 2); 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(integer -> {}, Throwable::printStackTrace); 

Или, если вы действительно хотите иметь все эти анонимные calsses вам следует изменить некоторые подписи

List<Integer> ints = new ArrayList<>(); 
    for (int i=1; i<10; i++) { 
     ints.add(i); 
    } 

    Log.d("RxFlapmapActivity", "flapMapEx2 1,2,3,4,5,6,7,8,9"); 
    Observable.just(ints) 
      .flatMap(new Function<List<Integer>, ObservableSource<Integer>>() { 
       @Override 
       public ObservableSource<Integer> apply(List<Integer> ints1) throws Exception { 
        return Observable.fromIterable(ints1); 
       } 
      }) 
      .filter(new Predicate<Integer>() { 
       @Override 
       public boolean test(Integer integer) { 
        Log.d("RxFlapmapActivity", "flapMapEx2222222 filter out odd numbers........."); 
        return integer % 2 == 0; 
       } 
      }) 
      .flatMap(new Function<Integer, ObservableSource<Integer>>() { 
       @Override 
       public ObservableSource<Integer> apply(Integer integer) throws Exception { 
        for (int i = 0; i < 1000000000; i++) { 
        } 
        return multiplyInt(integer, 2); 
       } 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Observer<Integer>() { 
       @Override 
       public void onSubscribe(Disposable d) { 

       } 
       @Override 
       public void onComplete() { 
       } 
       @Override 
       public void onError(Throwable e) { 
        e.printStackTrace(); 
       } 
       @Override 
       public void onNext(Integer integer) { 
       } 
      }); 

Основные вопросы в ваш код является функцией вместо Predicate в фильтре, как говорит @JohnWowUs. И наблюдаемый вместо ObservableSource в flatMap.

Но я думаю, что retrolambda/java8 намного лучше с rxjava. Они позволяют писать гораздо меньше кода и избегать таких проблем, используя вывод типа.

3

В rxjava2 Я считаю, что filter использует Predicate не Function например,

.filter(new Predicate<Integer>() { 
      @Override 
      public boolean test(Integer integer) { 
       Log.d("RxFlapmapActivity", "flapMapEx2222222 filter out odd numbers........."); 
       return integer.intValue() % 2 == 0; 
      } 
     }) 
+0

Yup, просто хотел ответить на этот вопрос :) – GraSim