Refactor double foreach и если заявление в java 8 решение

общий короткий ответ: если вы используете 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 результаты.

1
задан Stefan Zobel 13 July 2018 в 08:59
поделиться

3 ответа

Вы можете сделать это:

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());
3
ответ дан Mạnh Quyết Nguyễn 17 August 2018 в 13:19
поделиться

Для достижения этой цели вы можете использовать функцию stream() для Java 8:

usersInSpecificProject.addAll(allUsers.stream()
        .filter(u -> u.getProjects().stream().map(Project::getId)
        .anyMatch(projId-> projId.equals(projectId)))
        .collect(Collectors.toList()));

Вот ссылка на документацию о том, как stream() работает.

1
ответ дан Mukesh A 17 August 2018 в 13:19
поделиться
  • 1
    Это не сработает: после flatMap это Stream<Project>, а не Stream<User>. – M. Prokhorov 13 July 2018 в 09:40
  • 2
    Да, спасибо, что указали это, я исправил его сейчас. – Mukesh A 13 July 2018 в 10:09

Вы можете сделать это так,

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.

1
ответ дан Ravindra Ranwala 17 August 2018 в 13:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: