如何使用Stream <e>代替Collection <e>或List <e>?</e> </e> </e>

时间:2014-01-28 15:07:57

标签: java lambda java-8 java-stream

考虑我目前的以下课程:

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>的工作呢?如果确实如此,我怎样才能确保在第一种情况下订单无关紧要,而在第二种情况下它确实重要?

1 个答案:

答案 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