2016-11-03 2 views
1

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

Понятно, что это легко, и это работает, но некоторые имена автора имеют значение null, а приложение выдает exepcion. Поэтому мне нужно сделать чек для каждого элемента в списке новостей, если имя автора равно 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) { 

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

ответ

1

Вот некоторые общие функции утилиты, которые помогут вам с нулевой проверкой. Добавьте их в класс Utils или что-то в этом роде. Также обратите внимание, что проверка Струнных нулей, отличается от проверки объекта нулей

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» необязательно, чтобы строка была нулевой.

+0

oh действительно глупая ошибка, но спасибо в любом случае. – STK90