Как назначить значение переменной в анонимном классе Java

Я хочу присвоить результирующее значение моей переменной списка, но переменная в лямбда-выражении должна быть конечной, а если она конечная, она не может получить значение.

public List<PersonalInfo> getAllPatient() {

    List<PersonalInfo> mPersonalInfoList;
    AppDatabase db = AppDatabase.getAppDatabase(mContext);
    db.patientDao().getAll()
            .flatMapIterable(patientlist -> {
                    List<PersonalInfo> personalInfoList = new ArrayList<>();
                    for (PersonalInfo p: patientlist) {
                        p.setColor(getRandomMaterialColor("400"));
                        personalInfoList.add(p);
                    }
                    return  personalInfoList;
            })
            .toList()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(result ->
               // error
                mPersonalInfoList =result
             );
    return mPersonalInfoList;
}

3 ответа

Проблема заключается в том, что ваш метод возвращается до того, как значение будет присвоено вашей переменной. Вы можете решить эту проблему с помощью блокировки.

Попробуй это:

public List<PersonalInfo> getAllPatient() {
    final List<PersonalInfo> mPersonalInfoList = new ArrayList<>();
    AppDatabase db = AppDatabase.getAppDatabase(mContext);
    db.patientDao().getAll()
            .flatMapIterable(patientlist -> {
                    List<PersonalInfo> personalInfoList = new ArrayList<>();
                    for (PersonalInfo p : patientlist) {
                        p.setColor(getRandomMaterialColor("400"));
                        personalInfoList.add(p);
                    }
                    return  personalInfoList;
            })
            .toList()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(result -> {
                synchronized (mPersonalInfoList) {
                    mPersonalInfoList.addAll(result);
                    mPersonalInfoList.notifyAll();
                }
              }
            );

    synchronized (mPersonalInfoList) {
            try {
                mPersonalInfoList.wait();
            } catch (InterrupedException ex) {
                ex.printStackTrace();
            }
    }

    return mPersonalInfoList;
}

Ну, в вашем случае вы можете инициализировать mPersonalInfoList и вместо того, чтобы назначать свой результат, добавить его в mPersonalInfoList.

Так:

final List<PersonalInfo> mPersonalInfoList = new ArrayList<>();

...

.subscribe(result ->
    mPersonalInfoList.addAll(result);
);

Вы можете преобразовать свою локальную переменную в члена класса, это должно решить вашу проблему.

Другие вопросы по тегам