Поток внешнего цикла, но собирать в список объектов внутреннего цикла - PullRequest
0 голосов
/ 17 октября 2018

У меня есть внешние и внутренние петли.Они выглядят так:

List<InnerObject> result = new ArrayList<>(innerObjects.size());
        for (OuterObject outerObject : outerObjects) {
            for (InnerObject innerObject : innerObjects) {
                if (someBooleanMethod(innerObject, outerObject)) {
                    result.add(innerObject);
                    break;
                }
            }
        }

Как вы можете видеть для каждого внешнего объекта, я зацикливаюсь на внутреннем списке и проверяю элементы, и, если они проверяются на совпадение, я добавляю внутренний объект в список результатов.

Я хочу переписать его с помощью Stream API, но я столкнулся с проблемой, что не могу собрать его в список внутренних объектов.

Решение, приведенное ниже, работает почти правильно, но создает списокOuterObjects вместо Inner.

  List<OuterObject> result = outerObjects.stream()
                    .filter(outerObject -> innerObjects().stream()
                            .anyMatch(innerObject -> someBooleanMethod(innerObject, outerObject).
                    .collect(Collectors.toList());

Как переписать его, чтобы получить список InnerObjects?

1 Ответ

0 голосов
/ 17 октября 2018

Просто поток по внутреннему List:

List<InnerObject> result = 
    innerObjects.stream()
                .filter(innerObject -> outerObjects.stream()
                                                   .anyMatch(outerObject -> someBooleanMethod(innerObject, outerObject)))
                .collect(Collectors.toList());

или, если вам нужно поток по внешнему List, map каждый OuterObject к первому совпадению InnerObject:

List<InnerObject> result = 
    outerObjects.stream()
                .map(outerObject -> innerObjects.stream()
                                                .filter(innerObject -> someBooleanMethod(innerObject, outerObject))
                                                .findFirst()
                                                .orElse(null))
                .filter(Objects::nonNull)
                .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...