Oto miły sposób, który dołącza do dowolnej liczby instancji ByteBuffer
. Te metody zostały wyodrębnione z utworzonej klasy Joiner
, która ma o wiele więcej niż zwykłe dołączenie do instancji ByteBuffer
.
Wyodrębniłem tylko metody odnoszące się do tego pytania i nie opublikowałem reszty klasy ze względu na zwięzłość.
Zapewnia to szerokie zastosowanie Guawy dla wygody. Jeśli nie chcesz używać Guava, zastąpienie kodu Guava jest ćwiczeniem dla czytelnika.
public ByteBuffer join(@Nonnull final Iterable<ByteBuffer> iterable)
{
/* in the actual code this is separate class, it is included here
like this for brevity */
@SuppressWarnings("ConstantConditions")
final Function<Iterable<Integer>,Integer> sum = new Function<Iterable<Integer>,Integer>(){
private int sum = 0;
@Nullable
@Override
public Integer apply(@Nullable final Iterable<Integer> input)
{
for (final Integer i : checkNotNull(input)) { sum += i; }
return sum;
}
};
final int byteCount = sum.apply(Iterables.transform(iterable, new Function<ByteBuffer, Integer>()
{
@Nullable
@Override
public Integer apply(@Nullable final ByteBuffer input)
{
return checkNotNull(input).remaining();
}
}));
final ByteBuffer bb = ByteBuffer.allocate(byteCount);
for (final ByteBuffer b : iterable)
{
bb.put(b);
}
bb.flip(); /* this is very important */
return bb;
}
@Override
public ByteBuffer join(@Nonnull final List<ByteBuffer> list)
{
return this.join((Iterable<ByteBuffer>) list);
}
@Override
public ByteBuffer join(@Nonnull final Set<ByteBuffer> set)
{
return this.join((Iterable<ByteBuffer>) set);
}
@Override
public ByteBuffer join(@Nonnull final ByteBuffer... varargs)
{
return this.join((Iterable<ByteBuffer>) Arrays.asList(varargs));
}
** OSTRZEŻENIE: ** 'position' i' limit' będą ustawione na 'pojemność', która prawdopodobnie ** nie ** jest tym, czego oczekiwałbyś lub chciałbyś, jeśli zamierzasz przetworzyć wynikowy' ByteBuffer'. Będziesz chciał wywołać '.flip()', aby móc przetworzyć całą zawartość zwróconego 'ByteBuffer', dodając na końcu' .flip(); '. –
Tak, 'flip()' lub 'position (0)' (Ja osobiście uważam, że ten ostatni jest bardziej czytelny) – Marco13