Создание липкой струи

1

Я хотел повторить каждый элемент в потоке фиксированное количество раз, поэтому я написал это - похоже, что он должен работать:

/**
 * Makes a stream sticky - each element sticks around for the specified length.
 */
public static <T> Stream<T> sticky(Stream<T> a, int sticky) {
    Iterator<T> ai = a.iterator();
    Iterable<T> i = () -> new Iterator<T>() {
        int stick = sticky;
        T next = null;

        @Override
        public boolean hasNext() {
            if (next == null) {
                if (ai.hasNext()) {
                    next = ai.next();
                    stick = sticky;
                }
            }
            return next != null;
        }

        @Override
        public T next() {
            T n = next;
            // Should it stick around?
            if (--stick <= 0) {
                next = null;
            }
            return n;
        }

    };
    return StreamSupport.stream(i.spliterator(), false);
}

public void test() {
    sticky(Stream.of("One", "Two"), 2).forEach(System.out::println);
}

К сожалению, это не работает - я получаю:

java.lang.ClassFormatError: Duplicate field name&signature in class file com/oldcurmudgeon/test/Test$1
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at com.oldcurmudgeon.test.Test.lambda$sticky$0(Test.java:30)
at com.oldcurmudgeon.test.Test$$Lambda$1/791452441.iterator(Unknown Source)
at java.lang.Iterable.spliterator(Iterable.java:101)
at com.oldcurmudgeon.test.Test.sticky(Test.java:56)
at com.oldcurmudgeon.test.Test.test(Test.java:61)
at com.oldcurmudgeon.test.Test.main(Test.java:66)

Что я могу изменить, чтобы избежать ошибки - или есть лучший способ?

Теги:
java-8
java-stream

2 ответа

2
Лучший ответ

Почему нет

a.flatMap(elem -> IntStream.range(0, n).mapToObj(i -> elem))
0

Мои 2 цента. Вы можете использовать команду "javap" (javap -c Test.class), чтобы увидеть фактический байтовый код. Там вы можете найти переменную экземпляра или имя метода, имеющие одну и ту же подпись. Использование команды "javap" должно дать вам лучшую картину. Вы можете опубликовать полный Java-код класса, для кого-то другого, чтобы сделать то же самое для вас или для получения более глубокого понимания.

  • 0
    Отправленный код завершен. Просто напишите это в классе и назовите «тест».

Ещё вопросы

Сообщество Overcoder
Наверх
Меню