Как перебрать все элементы в списке, используя Observables - PullRequest
0 голосов
/ 02 ноября 2018

Я учусь использовать rxjava. Как показано в коде ниже, у меня есть List<List<Person>>, что я планирую сделать, это перебрать все списки Person и отображать, сколько объектов типа Person в каждом списке.

Я кодировал следующее:

.map(p->p.get(0).getName().map(r->r.toUpperCase()).orElse("NULL_VALUE"))

но, как вы видите, я всегда ссылаюсь на номер элемента 0. Как я могу ссылаться на все элементы в списке, как если бы я использовал цикл for как следующие:

for (int i = 0; i< length; i++)
    p.get(i)

Надеюсь, мой вопрос ясен.

заранее спасибо

код

public static void main(String[] args) {
    Observable<List<Person>> observables = Observable.create(e-> {
        for(List<Person> p : Main.getPersons()) {
            e.onNext(p);
        }
        e.onComplete();
    });
     observables
    .map(p->p.get(0).getName().map(r->r.toUpperCase()).orElse("NULL_VALUE"))
    .doOnNext(r->System.out.println("r: " + r))
    .observeOn(Schedulers.io())
    .subscribe(new Observer() {
        @Override
        public void onComplete() {
            // TODO Auto-generated method stub
            System.out.println("onCompleted");
        }

        @Override
        public void onError(Throwable arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onNext(Object arg0) {
            // TODO Auto-generated method stub
            System.out.println("onNextFromObserver: " + arg0);
        }

        @Override
        public void onSubscribe(Disposable arg0) {
            // TODO Auto-generated method stub
        }
    });
}

private static <T> Observable<T> toObservable(T s) {
    return Observable.just(s);
}
private static List<List<Person>> getPersons() {
    return Arrays.asList(
            Arrays.asList(new Person("Sanna1", 59, "EGY"), new Person(null, 59, "EGY"), new Person("Sanna3", 59, null)),
            Arrays.asList(new Person("Mohamed1", 59, "EGY"), new Person(null, 59, "EGY")),
            Arrays.asList(new Person("Ahmed1", 44, "QTR"), new Person("Ahmed2", 44, "QTR"), new Person(null, null, "QTR")),
                    Arrays.asList(new Person("Fatma", 29, "KSA")),
                    Arrays.asList(new Person("Lobna", 24, "EGY")));
}
}

лицо

public class Person {
private String name = null;
private String address = null;
private int age;

private Optional<String> optName= null;
private Optional<Integer> optAge= null;
private Optional<String> optAddress = null;

public Person(String name, Integer age, String address) {
    this.optName = Optional.ofNullable(name);
    this.optAge = Optional.ofNullable(age);
    this.optAddress = Optional.ofNullable(address);
}

public Optional<String> getName() {
    return optName;
}

public void setName(String name) {
    this.optName = Optional.ofNullable(name);
}

public Optional<String> getAddress() {
    return this.optAddress;
}

public void setAddress(String address) {
    this.optAddress = Optional.ofNullable(address);
}

public Optional<Integer> getAge() {
    return this.optAge;
}

public void setAge(int age) {
    this.optAge = Optional.ofNullable(age);
}
}

обновление

public static void main(String[] args) {
    Observable<List<Person>> observables = 
    Observable.fromIterable(Main.getPersons());
    observables
    //.subscribeOn(Schedulers.io())
    .observeOn(Schedulers.io())
    .concatMap(list->Observable.fromIterable(list)
            .map(p->p.getName()
                    .map(r->r.toUpperCase()).orElse("NULL_VALUE")))
    .observeOn(Schedulers.io())
    .blockingSubscribe(new Observer<String>() {

        @Override
        public void onComplete() {
            // TODO Auto-generated method stub
            System.out.println("onComplete: ");
        }

        @Override
        public void onError(Throwable arg0) {
            // TODO Auto-generated method stub
            System.out.println("onError: ");
        }

        @Override
        public void onNext(Object arg0) {
            // TODO Auto-generated method stub
            System.out.println("onNext: ");
        }

        @Override
        public void onSubscribe(Disposable arg0) {
            // TODO Auto-generated method stub
            System.out.println("onSubscribe: ");
        }
    });

}

1 Ответ

0 голосов
/ 03 ноября 2018

Использование fromIterable с и concatMap:

public static void main(String[] args) {
    Observable<List<Person>> observables =
        Observable.fromIterable(Main.getPersons());

    observables
    .concatMap(personList -> 
        Observable.fromIterable(personList)
        .map(aPerson -> 
            aPerson.getName()
             .map(name -> name.toUpperCase()).orElse("NULL_VALUE")
        )
    )
    .doOnNext(aName -> System.out.println("aName: " + aName))
    .observeOn(Schedulers.io())
    .blockingSubscribe(new Observer<String>() {
        @Override
        public void onComplete() {
            System.out.println("onCompleted");
        }

        @Override
        public void onError(Throwable ex) {
            ex.printStackTrace();
        }

        @Override
        public void onNext(String item) {
            System.out.println("onNextFromObserver: " + item);
        }

        @Override
        public void onSubscribe(Disposable disposable) {
        }
    });
}
...