1

考虑我目前的以下课程:

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>用作输入,但是传递 aCollection<Drawable>甚至List<Drawable>工作吗?如果是这样,我如何确保在第一种情况下顺序无关紧要,而在第二种情况下很重要?

4

1 回答 1

1

我希望Stream<Drawable>用作输入,但是传递 aCollection<Drawable>甚至List<Drawable>工作呢?

不,流不是 Collection 类层次结构的一部分,因此如果您的方法期望 aStream<e>它不能接受 a Collection/List<E>

另请注意,在您的情况下传递流不一定会增加太多好处,因为流只能使用一次。例如,这将不起作用:

Stream<E> s = ...;
putAllDate(s);
countDataSize(s); //IllegalStateException

最后一条语句会导致java.lang.IllegalStateException: stream has already been operated upon or closed.

于 2014-01-28T15:25:31.233 回答