#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");
}
Моя проблема заключается в следующем:
- Можно ли было бы создать исключение при потоковой передаче данных здесь ?
sharePointDriveResponse.getColumns()
.stream()
.map(SharePointColumnsResponse::getDisplayName)
.collect(Collectors.toList())
.stream()
.filter(request.getFields()::containsKey)
.collect(Collectors.toList());
// some operator here to throw exception
- Моя вторая проблема заключается в том, что я также хочу создать исключение в зависимости от типа контента, определенного в запросе, и типа контента, разрешенного для столбца в SharePointDriveResponse.
В примере: я отправляю запрос на создание документа и передаю поле, которое не разрешено для документа, но разрешено для другого типа контента.
"columnGroup": "Billing or Whatever",
"description": "",
"displayName": "notADocumentColumn",
Я также хотел бы сделать исключение для этого случая.
Я также мог бы перестроить аналогичный материал, как я делал ранее, но я бы потерял эффективность для этой простой задачи.
- У меня также есть другой случай, когда моя «Группа столбцов» имеет значение, которое следует считать принятым для всех типов контента. Вот основная частичная реализация.
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;
}));