制作粘性流
Making a sticky stream
我想将流中的每个元素重复固定次数,所以我写了这个 - 看起来 应该 工作:
/**
* 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
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.access0(URLClassLoader.java:73)
at java.net.URLClassLoader.run(URLClassLoader.java:368)
at java.net.URLClassLoader.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[=11=](Test.java:30)
at com.oldcurmudgeon.test.Test$$Lambda/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)
我可以更改什么来避免错误 - 或者有更好的方法吗?
My 2 cents - 你可以使用"javap"命令(javap -c Test.class)来查看实际的字节码。在那里您可能会发现一些具有相同签名的实例变量或方法名称。使用 "javap" 命令应该会给你一个更好的画面。
您可能想要 post 完成 class 的 java 代码,以便其他人为您做同样的事情或获得更多见解。
为什么不
a.flatMap(elem -> IntStream.range(0, n).mapToObj(i -> elem))
我想将流中的每个元素重复固定次数,所以我写了这个 - 看起来 应该 工作:
/**
* 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
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.access0(URLClassLoader.java:73)
at java.net.URLClassLoader.run(URLClassLoader.java:368)
at java.net.URLClassLoader.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[=11=](Test.java:30)
at com.oldcurmudgeon.test.Test$$Lambda/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)
我可以更改什么来避免错误 - 或者有更好的方法吗?
My 2 cents - 你可以使用"javap"命令(javap -c Test.class)来查看实际的字节码。在那里您可能会发现一些具有相同签名的实例变量或方法名称。使用 "javap" 命令应该会给你一个更好的画面。 您可能想要 post 完成 class 的 java 代码,以便其他人为您做同样的事情或获得更多见解。
为什么不
a.flatMap(elem -> IntStream.range(0, n).mapToObj(i -> elem))