Java зависит от того, работаете ли вы с необработанными скомпилированными типами Protobuf или с обернутыми типами, предоставляемыми привязками языка Java.
Объекты, возвращаемые API, представлены с использованием трех основных типов:
Record
RecordField
Value
.
Несколько упрощенно, Record
- это список RecordField
, RecordField
является меткой, а Value
и Value
могут быть одной из многих вещей, включая Int64
, String
, Record
или List
.Кортежи типа (Int, Text)
имеют специальные обозначения в DAML, но представлены как обычные Record
объекты в API.
Предполагается, что вы используете типы, скомпилированные из определений protobuf, и получили в свои руки com.digitalasset.ledger.api.v1.ValueOuterClass.Value
, представляющий [(Int, Text)]
, вам нужно сделать следующее:
- Используйте
Value::getList
и ValueOuterClass.List::getElementsList
, чтобы развернуть Value
в List<Value>
. - Разверните каждый
Value
в списке с помощью Value::getRecord
, чтобы получить List<Record>
- Извлеките два поля каждой записи, используя
Record::getFields
, чтобы получить List<Pair<RecordField, RecordField>>
- Извлеките значения из
RecordFields
с RecordFields::getValue
, давая List<Pair<Value, Value>>
- Извлеките
Int64
, который является псевдонимом для long
и String
из Value
объектов, чтобы получить окончательный List<Pair<Long, String>>
Шаги 2. - 4. могут быть выполнены аккуратно с использованием потокового интерфейса Java.Показанный код предназначен для необработанных типов gRPC, начиная с com.digitalasset.ledger.api.v1.ValueOuterClass.Value
:
import com.digitalasset.ledger.api.v1.ValueOuterClass;
import static java.util.AbstractMap.SimpleImmutableEntry;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Demo {
static SimpleImmutableEntry<ValueOuterClass.RecordField, ValueOuterClass.RecordField> EntryFromTuple(ValueOuterClass.Record tupleRecord) {
return new SimpleImmutableEntry<>(tupleRecord.getFields(0), tupleRecord.getFields(1));
}
static class SimpleImmutableEntryMap<S, T, U, V> implements Function<SimpleImmutableEntry<S, T>, SimpleImmutableEntry<U, V>> {
Function<S, U> mapFst;
Function<T, V> mapSnd;
public SimpleImmutableEntryMap(Function<S, U> mapFst, Function<T, V> mapSnd) {
this.mapFst = mapFst;
this.mapSnd = mapSnd;
}
@Override
public SimpleImmutableEntry<U, V> apply(SimpleImmutableEntry<S, T> stEntry) {
return new SimpleImmutableEntry<> (mapFst.apply(stEntry.getKey()), mapSnd.apply(stEntry.getValue()));
}
}
static List<SimpleImmutableEntry<Long, String>> mapTuple(ValueOuterClass.Value v) {
return v.getList().getElementsList().stream()
.map(ValueOuterClass.Value::getRecord)
.map(Demo::EntryFromTuple)
.map(new SimpleImmutableEntryMap<>(ValueOuterClass.RecordField::getValue, ValueOuterClass.RecordField::getValue))
.map(new SimpleImmutableEntryMap<>(ValueOuterClass.Value::getInt64, ValueOuterClass.Value::getText))
.collect(Collectors.toList());
}
}