Рассмотрим следующий класс у меня в данный момент:Как использовать Stream <E> вместо Collection <E> или List <E>?
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()
.
Я wush использовать Stream<Drawable>
в качестве входных данных, однако это проходит в Collection<Drawable>
или List<Drawable>
работать даже тогда? Если да, то как я могу гарантировать, что в первом случае заказ не имеет значения, а во втором случае это имеет значение?
Боковой комментарий: 'drawables.stream(). MapToInt ((drawable) -> drawable.getDataSize()). Sum();' может быть написано 'drawables.stream(). MapToInt (Drawable :: getDataSize). sum(); ' – assylias