【问题标题】:How to use Stream<E> instead of Collection<E> or List<E>?如何使用 Stream<E> 而不是 Collection<E> 或 List<E>?
【发布时间】:2014-01-28 15:07:57
【问题描述】:

考虑一下我目前的以下课程:

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&lt;Drawable&gt;,因为我不关心顺序,我只想总结它们的大小。
  • 我使用drawables.stream(),如果我传入Stream&lt;Drawable&gt; 参数,这将是多余的。

接下来看看putAllData

  • 就像这里所说的那样,我有 List&lt;Drawable&gt; drawables,因为这次的顺序很重要。
  • 我使用drawables.stream() 来访问它们,这是按照forEachOrdered() 的顺序发生的。

我希望使用Stream&lt;Drawable&gt; 作为输入,但是传递Collection&lt;Drawable&gt;List&lt;Drawable&gt; 是否有效?如果是这样,我如何确保在第一种情况下顺序无关紧要,而在第二种情况下很重要?

【问题讨论】:

  • 旁注:drawables.stream().mapToInt((drawable) -&gt; drawable.getDataSize()).sum();可以写drawables.stream().mapToInt(Drawable::getDataSize).sum();

标签: java lambda java-8 java-stream


【解决方案1】:

我希望使用Stream&lt;Drawable&gt; 作为输入,但是传入Collection&lt;Drawable&gt;List&lt;Drawable&gt; 是否有效?

不,流不是 Collection 类层次结构的一部分,因此如果您的方法需要 Stream&lt;e&gt;,则它不能接受 Collection/List&lt;E&gt;

还请注意,在您的情况下,传递流不一定会增加很多好处,因为流只能被使用一次。例如,这是行不通的:

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

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

【讨论】:

  • 好吧,确实有道理,之前没有考虑过。任何线索如何在字节码中转换,因为在这种情况下,巨大的性能损失不值得流?
  • @skiwi 我没有测量,但性能损失可能很小 - 最后它会遍历你的集合并添加整数,或多或少与你将它写成循环的方式相同.
  • @skiwi 如果您有很多 (>10,000) 个元素,countDataSize 将带来巨大的性能提升:写入 drawables.parallelStream().mapToInt(Drawable::getDataSize).sum(); 以获得并行执行。
猜你喜欢
  • 2011-09-04
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 2014-03-24
相关资源
最近更新 更多