Есть ли способ конвертировать результаты Stream в Array и перебирать элементы Array? - PullRequest
0 голосов
/ 07 апреля 2019

Я создал Stream для рекурсивного запуска по количеству файлов и папок.Мне нужно преобразовать результат Stream в Array и перебрать результаты Array.

У меня проблемы со следующим кодом:

try (Stream<Path> stream = Files.walk(start, Integer.MAX_VALUE)) {
        List<String> collect = stream
            .stream().map(x->x.getName())
            .filter(s -> s.toString().endsWith(".txt"))
            .sorted()
            .collect(Collectors.toList())
            .toArray();

        collect.forEach(System.out::println);
    }

    String[] listfiles = new String[stream.length];
    for (int i = 0; i < stream.length; i++) {
       listfiles[i] = stream[].getName();
    }

1 Ответ

1 голос
/ 07 апреля 2019

Есть несколько проблем с кодом, который вы отправили.

  1. Вы звоните stream.stream()
    • Класс Stream не имеет метода stream(). Не имеет смысла иметь такой метод, потому что это уже поток.
  2. Вы звоните x.getName()
    • На данный момент x - это Path, у которого нет getName() метода. Вы можете использовать getFileName(), который возвращает Path, или toString(), который возвращает путь в виде строки, или комбинировать два, чтобы получить только имя файла в виде строки.
  3. Вы присваиваете List<String> collect результату Collection.toArray().
    • Этот метод возвращает Object[].
  4. Вы используете collect(Collectors.toList()) перед вызовом toArray().
    • Класс Stream имеет метод toArray(), поэтому нет необходимости сначала собирать его в список, если массив является желаемым конечным результатом.
  5. Вы используете toArray(), который возвращает Object[] (как для Stream, так и Collection)
    • Вы хотите String[], что означает, что, поскольку нет необходимости сначала собирать деньги, вам нужно позвонить Stream.toArray(IntFunction).
  6. Вы используете stream вне блока try.
    • Поскольку stream является локальным для блока try, его нельзя использовать за пределами блока try. У вас также нет причин использовать его за пределами блока, поскольку вам нужен только результат String[].
  7. Вы пытаетесь сделать что-то вроде stream[].
    • A Stream не является массивом и не может быть доступен как один. Кроме того, Stream - это не контейнер, а трубопровод; пытаться получить доступ к определенным элементам в нем не имеет смысла.
    • Это также относится к stream.length, поскольку Stream не имеет поля length (опять же, потому что это не массив).

Исправляя эти проблемы, ваш код может выглядеть примерно так (на основе текущей формы вашего кода, поскольку я не уверен, что именно вы пытаетесь сделать):

String[] result;
try (Stream<Path> stream = Files.walk(start, Integer.MAX_VALUE)) {
    result = stream.map(Path::toString)
            .filter(s -> s.endsWith(".txt"))
            .sorted()
            .toArray(String[]::new);
}

for (int i = 0; i < result.length; i++) {
    // do something
}

Вы также можете рассмотреть возможность использования Files.find(Path,int,BiPredicate,FileVisitOption...) и / или PathMatcher.

...