考虑我目前的以下课程:
public interface Drawable {
public void compileProgram();
public Program getProgram();
public int getDataSize();
public FloatBuffer putData(final FloatBuffer dataBuffer);
public int getDataMode();
public static int countDataSize(final Collection<Drawable> drawables) {
return drawables.stream().mapToInt((drawable) -> drawable.getDataSize()).sum();
}
public static FloatBuffer putAllData(final List<Drawable> drawables) {
FloatBuffer dataBuffer = BufferUtils.createFloatBuffer(countDataSize(drawables) * 3);
drawables.stream().forEachOrdered((drawable) -> dataBuffer.put(drawable.putData(dataBuffer)));
return (FloatBuffer)dataBuffer.clear();
}
}
现在看一下countDataSize
:
Collection<Drawable>
,因为我不关心订单,我只是想总结一下它们的大小。drawables.stream()
,如果我传入Stream<Drawable>
参数,这将是多余的。接下来看看putAllData
:
List<Drawable> drawables
,因为这次的命令很重要。drawables.stream()
来访问它们,这与forEachOrdered()
按顺序发生。我急于使用Stream<Drawable>
作为输入,但是传入Collection<Drawable>
或List<Drawable>
的工作呢?如果确实如此,我怎样才能确保在第一种情况下订单无关紧要,而在第二种情况下它确实重要?
答案 0 :(得分:1)
我希望使用
Stream<Drawable>
作为输入,然而传入Collection<Drawable>
或List<Drawable>
甚至工作呢?
不,流不属于Collection类层次结构,因此如果您的方法需要Stream<e>
,则它无法接受Collection/List<E>
。
另请注意,传递流并不一定会在您的情况下增加太多的好处,因为流只能被消耗一次。例如,这不起作用:
Stream<E> s = ...;
putAllDate(s);
countDataSize(s); //IllegalStateException
最后一个语句会导致java.lang.IllegalStateException: stream has already been operated upon or closed
。