Сделайте исключение для потока Java API

#java #java-stream

Вопрос:

У меня есть объект, содержащий свойство, представляющее собой список объектов, содержащих 2 строковых свойства. Моя цель состоит в том, чтобы сравнить ключи этой карты с другим объектом, который содержит строковое свойство.

Для большей ясности мой запрос содержит карту:

 "documentType": "Document"
"fields": [
  {
    "name": "something",
    "value": "123456789"
  },
  {
    "name": "somethingElse",
    "value": "Someone"
  },
  {
    "name": "notADocumentColumn",
    "value": "shouldThrowException"
  },
  {
    "name": "notexistingcolumn",
    "value": "not a column"
  }
]
 

Мой sharePointDriveResponse содержит столбцы:

 "columns": [
     {
         "columnGroup": "Document",
         "description": "",
         "displayName": "something",
         "enforceUniqueValues": false,
         "hidden": false,
         "id": "8553196d-ec8d-4564-9861-xxxxxxxxxxxx",
         "indexed": false,
         "name": "FileLeafRef",
         "readOnly": false,
         "required": true
    },
    {
         "columnGroup": "Billing or Whatever",
         "description": "",
         "displayName": "notADocumentColumn",
         "enforceUniqueValues": false,
         "hidden": false,
         "id": "3a6b296c-3f50-445c-a13f-xxxxxxxxxxxx",
         "indexed": false,
         "name": "ComplianceAssetId",
         "readOnly": true,
         "required": false,
         "text": {
             "allowMultipleLines": false,
             "appendChangesToExistingText": false,
             "linesForEditing": 0,
             "maxLength": 255
         }
     },
 

На этом этапе я реализовал то, что отлично работает:

 List<String> check = sharePointDriveResponse.getColumns()
        .stream()
        .map(SharePointColumnsResponse::getDisplayName)
        .collect(Collectors.toList())
        .stream()
        .filter(request.getFields()::containsKey)
        .collect(Collectors.toList());

if(check.size() == request.getFields().size()) {
    System.out.println("It's OK !");
} else {
    throw new RequestException("One column provided doesn't exist");
}
 

Моя проблема заключается в следующем:

  1. Можно ли было бы создать исключение при потоковой передаче данных здесь ?
 sharePointDriveResponse.getColumns()
            .stream()
            .map(SharePointColumnsResponse::getDisplayName)
            .collect(Collectors.toList())
            .stream()
            .filter(request.getFields()::containsKey)
            .collect(Collectors.toList());
            // some operator here to throw exception 
 
  1. Моя вторая проблема заключается в том, что я также хочу создать исключение в зависимости от типа контента, определенного в запросе, и типа контента, разрешенного для столбца в SharePointDriveResponse.

В примере: я отправляю запрос на создание документа и передаю поле, которое не разрешено для документа, но разрешено для другого типа контента.

 "columnGroup": "Billing or Whatever",
"description": "",
"displayName": "notADocumentColumn",
 

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

  1. У меня также есть другой случай, когда моя «Группа столбцов» имеет значение, которое следует считать принятым для всех типов контента. Вот основная частичная реализация.
 List<String> checkColumnsContentType = sharePointDriveResponse.getColumns()
        .stream()
        .map(SharePointColumnsResponse::getColumnGroup)
        .collect(Collectors.toList())
        .stream()
        .filter(request.getFields()::containsKey)
        .collect(Collectors.toList());
 

Комментарии:

1. Почему вы это делаете .collect(toList()).stream() ? Это не имеет смысла.

2. ой, ты прав. Я удалил .собираю(Коллекционеры. ToList()).stream() для того же результата. Мне нужно поспать 🙂

Ответ №1:

Я нашел ответ на пункт 1 своего вопроса. Поскольку на написание вопроса ушло некоторое время, я оставил этот вопрос даже после его решения. Вот моя реализация.

     sharePointDriveResponse.getColumns()
            .stream()
            .map(SharePointColumnsResponse::getDisplayName)
            .collect(toList())
            .stream()
            .filter(request.getFields()::containsKey)
            .collect(collectingAndThen(toList(), l -> {
                if (l.size() != request.getFields().size())
                    throw new RuntimeException("One column provided doesn't exist");
                return l;
            }));