общий короткий ответ: если вы используете AJAX для выполнения запросов данных, вы можете легко отправлять и возвращать объекты в виде строк JSON. Доступные расширения для поддержки Javascript для вызовов JSON () для всех типов javascript для отправки данных на сервер по запросу AJAX. Ответы AJAX могут возвращать объекты как строки JSON, которые могут быть преобразованы в объекты Javascript простым вызовом eval, например. если функция AJAX someAjaxFunctionCallReturningJson вернулась
"{ \"FirstName\" : \"Fred\", \"LastName\" : \"Flintstone\" }"
, которую вы могли бы написать в Javascript
var obj = eval("(" + someAjaxFunctionCallReturningJson().value + ")");
alert(obj.FirstName);
alert(obj.LastName);
JSON также может использоваться для полезных сервисов web-сервисов и др., но это действительно удобно для AJAX результаты.
Вы можете сделать это:
List<User> usersInSpecificProject =
allUsers.stream()
.filter(u -> u.getProjects().stream()
.map(Project::getId)
.anyMatch(pid -> pid.equals(projectId)))
.collect(Collectors.toList());
Ваша исходная версия должна быть улучшена с помощью break
после выполнения условия if(project.getId().equals(projectId))
.
Именно поэтому filter
использует anyMatch()
, чтобы разбить первое совпадение.
Для более элегантной версии вы можете указать наш фильтр:
Predicate<User> hasProject = u -> u.getProjects().stream()
.map(Project::getId)
.anyMatch(pid -> pid.equals(projectId));
List<User> result = allUsers.stream().filter(hasProject).collect(toList());
Для достижения этой цели вы можете использовать функцию stream()
для Java 8:
usersInSpecificProject.addAll(allUsers.stream()
.filter(u -> u.getProjects().stream().map(Project::getId)
.anyMatch(projId-> projId.equals(projectId)))
.collect(Collectors.toList()));
Вот ссылка на документацию о том, как stream()
работает.
flatMap
это Stream<Project>
, а не Stream<User>
.
– M. Prokhorov
13 July 2018 в 09:40
Вы можете сделать это так,
List<User> users = allUsers.stream()
.filter(u -> u.getProjects().stream().anyMatch(p -> p.getId().equals(projectId)))
.collect(Collectors.toList());
Для каждого пользователя вам нужно иметь filter
predicate
, чтобы проверить, имеет ли пользователь проект с заданным значением projectId
, Если это так, мы просто собираем удовлетворяющие User
объекты в контейнер результатов.
Если вам нужно преобразовать объекты домена User
в тип UserDto
, как указано в вашей постановке проблемы, вам нужно иметь дополнительную функцию map
для такого преобразования.
List<UserDto> users = allUsers.stream()
.filter(u -> u.getProjects().stream().anyMatch(p -> p.getId().equals(projectId)))
.map(u -> new UserDto(u.getProjects()))
.collect(Collectors.toList());
Однако вам может потребоваться изменить это в соответствии с вашим классом UserDto
.
anyMatch(projectId::equals)
– Holger 13 July 2018 в 11:39