Kotlin: mapNotNull, но лог, что вызвало нулевые элементы - PullRequest
0 голосов
/ 03 июля 2019

При переводе Java в код Kotlin я обнаружил следующее:

List<Content> getContent(List<Node> nodes, Map<String, Content> content) {
  List<Content> result = new ArrayList<>(nodes.size());
  for (Node node : nodes) {
    Content content = content.get(node.getId());
    if (content == null) {
      logger.atSevere().log("Content %s was not found", node.getId());
      continue;
    }
    result.add(content);
  }
  return result;
}

В Kotlin это может быть легко переведено, если мы отбросим вызов логгера:

fun getContent(items: List<Node>, content: Map<String, Content): List<Content> {
  val contentIds = items.mapNotNull { it.id }
  return contentIds.mapNotNull { contentMap[it] }
}

Я думаю, что здесь может быть неплохо построить секвенсор. Также возможно разделить contentIds на две отдельные коллекции, одна из которых состоит из contentIds, которых не было в contentMap, а другая состоит из Content, успешно сопоставленных. Бьюсь об заклад, есть также лучший способ получить набор элементов на карте из набора ключей, но я не нашел нужную функцию.

1 Ответ

0 голосов
/ 03 июля 2019

Пожалуйста, попробуйте следующее:

fun check(items: List<Node>, content: Map<String, Content?>): List<Content>{
    return items.filter{
            if (content[it.id] == null){
              print("content " + it.id + "was not found")   
            }
            content[it.id] != null
        }.map{content[it.id]!!} 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...