检查列表中每个项目的空值

Check null values for each item in list

我有新闻列表。每个新闻都有作者 ID,我需要从新闻中获取作者 ID,然后调用 Author 获取他的名字并将作者的名字设置为每个新闻。

看起来很简单,而且有效,但是有些作者的名字是空的,应用程序抛出一个exepcion。因此,如果作者姓名为空,我需要检查新闻列表中的每个项目,将其替换为 "unknown" 字符串。我的变体不起作用。

   .flatMap(new Func1<News, Observable<News>>() {
        @Override
        public Observable<News> call(News news) {
            return apiService.getAuthor(news.getId())
                    .doOnNext(new Action1<Author>() {
                        @Override
                        public void call(Author author) {

                            if (!author.getName().equals("null")) {
                                news.setAuthorName(author.getName());
                            } else {
                                news.setAuthorName("Unknown");
                            }
                        }
                    })
                    .observeOn(Schedulers.io())
                    .map(new Func1<Author, News>() {
                        @Override
                        public News call(Author author) {
                            return news;
                        }
                    })
                    .subscribeOn(Schedulers.newThread());
        }
    })

以下是一些常用的实用函数,可帮助您进行空值检查。将这些添加到 Utils class 或其他东西。另请注意,检查字符串空值与检查对象空值不同

private static final String EMPTY = "";
private static final String NULL = "null";

/**
 * Method checks if String value is empty
 *
 * @param str
 * @return string
 */
public static boolean isStringEmpty(String str) {
    return str == null || str.length() == 0 || EMPTY.equals(str.trim()) || NULL.equals(str);
}

/**
 * Method is used to check if objects are null
 *
 * @param objectToCheck
 * @param <T>
 * @return true if objectToCheck is null
 */
public static <T> boolean checkIfNull(T objectToCheck) {
    return objectToCheck == null;
}

现在更新您的代码

.flatMap(new Func1<News, Observable<News>>() {
        @Override
        public Observable<News> call(News news) {
            return apiService.getAuthor(news.getId())
                    .doOnNext(new Action1<Author>() {
                        @Override
                        public void call(Author author) {
                            // notice how I first confirm that the object is not null 
                            // and then I check if the String value from the object is not null
                            if (!Utils.checkIfNull(author) && !Utils.isStringEmpty(author.getName()) {
                                news.setAuthorName(author.getName());
                            } else {
                                news.setAuthorName("Unknown");
                            }


                        }
                    })
                    .observeOn(Schedulers.io())
                    .map(new Func1<Author, News>() {
                        @Override
                        public News call(Author author) {
                            return news;
                        }
                    })
                    .subscribeOn(Schedulers.newThread());
        }
    })

您遇到问题的原因是您正在检查字符串文字,"null"不一定是字符串为空。