В приведенном ниже фрагменте кода используется метод 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» в своей любимой поисковой системе, чтобы найти источник 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
Спасибо @k314159, но еще один глупый вопрос. Я получаю Cannot resolve symbol 'E' как избавиться от этого?
Спасибо, @ user16320675, я изменил свой ответ с вашим исправлением.
Вы можете «украсть» его из более нового JDK, это пара строк кода: github.com/openjdk/jdk/blob/… — я думаю, что это могло произойти в этом ответе однажды: stackoverflow.com/ а/23276455/7916438