Java Stream - обратная ссылка на предыдущий класс - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть два класса:

@Getter
@Setter
class Class
{
    private Long id;

    private String someValue;

    private List<SubClass> subclasses;
}

@Getter
@Setter
class SubClass
{
    private Long id;

    private String someSearchValue;
}

Мне нужно найти сначала Class и сначала SubClass, где какое-то значение соответствует полю SubClass.someSearchValue.

Это то, что сделал:

void someMethod(List<Class> classes){

    SubClass foundSubClass = classes.stream()
        .flatMap(c -> c.getSubclasses().stream())
        .filter(sc -> "someValueToSearch".equals(sc.getSomeSearchValue()))
        .findFirst().get();

    Class someClass = classes.stream()
        .filter(c -> c.getSubclasses().stream().anyMatch(sc -> "someValueToSearch".equals(sc.getSomeSearchValue())))
        .findFirst().get();
}

Как видите, я должен дважды использовать filter, используя это же условие "someValueToSearch".equals(sc.getSomeSearchValue()), чтобы найти оба объекта.Есть ли возможность найти оба объекта, используя filter только один раз?Я знаю, что самый простой способ сделать это - поместить ссылку на Class в Subclass, но я не могу этого сделать.

Есть идеи?

1 Ответ

0 голосов
/ 22 февраля 2019

Что ж, мы можем утверждать, что foundSubClass определенно должен быть дочерним someClass - первым с someValueToSearch - так что, безусловно, можно получить выигрыш в эффективности, изменив порядок потоков и глядя только на someClass во втором поиске.

Вы также можете привести это в порядок, используя ссылку на метод вместо определения одной и той же лямбды дважды.

Class someClass = classes.stream()
    .filter(c -> c.getSubclasses().stream().anyMatch(Test::search))
    .findFirst()
    .get();

SubClass foundSubClass = someClass.getSubclasses().stream()
    .filter(Test::search)
    .findFirst()
    .get();

//...

private static boolean search(SubClass subClass)
{
    return "someValueToSearch".equals(subClass.getSomeSearchValue());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...