Как проверить два массива друг против друга, используя потоки - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть список приложений в массиве, у меня есть каталог, который будет содержать только файлы JAR (я использую отражение для доступа к этим файлам JAR на моей платформе).Я хочу просмотреть все файлы внутри каталога, найти все файлы jar, а затем проверить, что они являются частью списка массивов проверенных приложений, и из этого создать новый список массивов всех проверенных иСуществуют.

Пока у меня есть это:

App.getAppStore()
   .stream()
   .filter(o -> {
       File[] listOfFiles = new File("C:/Temp/MyApps/").listFiles();
       Object[] foo = Arrays.stream(listOfFiles)
                            .filter(x -> x.getName().contains(o.getName()))
                            .toArray();

       return true;
}).toArray();

Однако, это дает мне все внутри массива, даже если они не существуют в файле.Буду признателен за любую помощь, и я хочу использовать поток.

Я хотел бы превратить это:

ArrayList<Application> verifiedApps = new ArrayList<verifiedApps>();
for( Application app : App.getAppStore() ) {
    for( File verifiedApp : new File("C:/Temp/MyApps/").listFiles() ) {
        if( verifiedApp.getName().contains( app.getName() )
            verifiedApps.add( app );
    }
}

В использование потока, чтобы привыкнуть к знанию, как использовать потоки.

1 Ответ

0 голосов
/ 30 сентября 2018

Проблема в том, что вы всегда возвращаете true из filter.

File[] listOfFiles = new File("C:/Temp/MyApps/").listFiles();
Set<String> filesNames = Arrays.stream(listOfFiles)
                               .map(File::getName)
                               .collect(Collectors.toSet());

Это можно переместить за пределы лямбды filter, чтобы избежать создания File[] для каждого приложения.Этот массив File s может быть сопоставлен с именами файлов с помощью map(File::getName) и объединить их в набор для дальнейших поисков.

Тогда у вас будет следующее

List<Application> verifiedApps = 
    App.getAppStore()
       .stream()
       .filter(o -> filesNames.contains(o.getName() + ".jar"))
       .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...