Как назначить значение переменной в анонимном классе 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);
);
Вы можете преобразовать свою локальную переменную в члена класса, это должно решить вашу проблему.