Эквивалентная реализация asIterator для Java9 в Java8

В приведенном ниже фрагменте кода используется метод asIterator() из Java 9. Может ли кто-нибудь помочь мне преобразовать приведенный ниже код, совместимый с Java 8?

private static Function<ClassLoader, Stream<URL>> asURLs(String packageDir) {
    return cl -> {
      try {
        Iterator<URL> iterator = cl.getResources(packageDir).asIterator();
        return StreamSupport.stream(
            Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false);
      } catch (IOException e) {
        throw new UnhandledIOException(e);
      }
    };

Вы можете «украсть» его из более нового JDK, это пара строк кода: github.com/openjdk/jdk/blob/… — я думаю, что это могло произойти в этом ответе однажды: stackoverflow.com/ а/23276455/7916438

tevemadar 15.05.2023 13:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для начала найдите «исходный код jdk» в своей любимой поисковой системе, чтобы найти источник asIterator, чтобы вы могли его скопировать. Вы найдете это здесь:

https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/util/Enumeration.java

Там вы найдете Enumeration.asIterator(), который является методом интерфейса по умолчанию. Вы можете определить его локально как метод, который принимает аргумент перечисления:

private static <E> Iterator<E> asIterator(Enumeration<E> enumeration) {
    return new Iterator<>() {
        @Override public boolean hasNext() {
            return enumeration.hasMoreElements();
        }
        @Override public E next() {
            return enumeration.nextElement();
        }
    };
}

а затем используйте его следующим образом:

    Iterator<URL> iterator = asIterator(cl.getResources(packageDir));

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

метод интерфейса по умолчанию является функцией java 8 geeksforgeeks.org/default-methods-java

Sharon Ben Asher 15.05.2023 13:37

Спасибо @k314159, но еще один глупый вопрос. Я получаю Cannot resolve symbol 'E' как избавиться от этого?

Swapnil Kotwal 15.05.2023 14:29

Спасибо, @ user16320675, я изменил свой ответ с вашим исправлением.

k314159 15.05.2023 15:12

Другие вопросы по теме