簡體   English   中英

如何在匿名類java中分配變量值

[英]how to assign variable value in an anonymous class java

我想將結果值分配給列表變量,但是lambda中的變量必須為final,如果為final,則無法接收值。

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;
}

問題在於,在將值分配給變量之前,您的方法將返回。 您可以使用鎖解決此問題。

嘗試這個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM