Преобразовать в выражение лямда - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь выяснить, есть ли способ преобразовать его в выражение потока / фильтра Java 8.

        List<IChangelistSummary> bugChanges ........ 
        for (IChangelistSummary bugChange : bugChanges)
        {
            IChangelist changeInfo = server.getChangelist(bugChange.getId());
            List<IFileSpec> fileSpecs = changeInfo.getFiles(true);
            boolean canAccept = false;
            for (IFileSpec fileSpec : fileSpecs)
            {
                if (fileSpec.getDepotPathString().contains("release1234"))
                {
                    canAccept = true;
                    break;
                }
            }
            if (canAccept)
            {
                System.out.println("bugChange="+ bugChange.getId() + "=="+ bugChange.getDescription());
            }
        }

Я уже использовал поток / фильтр Java 8, чтобы получить экземпляр bugChanges., но я не могу понять, как преобразовать следующий код в Java 8.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Есть 2 for-loops и 2 if условия.Это может быть заменено внешним и внутренним потоком.

 Option<IChangelistSummary> summary = bugChanges.stream()
            .filter(bugChange -> server
                                    .getChangelist(bugChange.getId())
                                    .getFiles(true)
                                    .stream()
                                    .anyMatch( spec ->
                                            spec.getDepotPathString()
                                                .contains("release1234")
                                    )
            )
            .forEach(bug -> 
              System.out.println( 
                "bugChange="+ bug.getId() + "=="+ bug.getDescription())
              )
             );

Это выглядит немного некрасиво.Во внешнем потоке мы исследуем bugChange элементов и оставляем только те элементы, которые удовлетворяют фильтру Predicate.Теперь во внутреннем потоке мы проверяем, содержат ли файлы, связанные с текущей bug id строкой "release1234".И наконец мы печатаем результаты.

0 голосов
/ 05 июня 2018

Вам нужно захватить начальное значение до конца, используя flatMap.

bugChanges.stream().flatMap(bugChange -> Stream.of(server.getChangelist(bugChange.getId()))
        .map(changeInfo -> changeInfo.getFiles(true))
        .filter(fsList -> fsList.stream().anyMatch(fs -> fs.getDepotPathString().contains("release1234")))
        .map(fs -> bugChange)).forEach(bugChange -> System.out.println("bugChange="+ bugChange.getId() + "=="+ bugChange.getDescription()));
...