gpt4 book ai didi

daml - 如何将通过 DA Ledger API 接收的 DAML 元组转换为 Java 对?

转载 作者:行者123 更新时间:2023-12-01 22:59:35 26 4
gpt4 key购买 nike

我编写了一个生成元组列表的 DAML 模型,例如[(Int, Text)] .我通过 DA Ledger API 收到这些数据 - 如何将其转换为 List<Pair<Long, String>>在 Java 中?

最佳答案

Java 取决于您使用的是原始编译的 Protobuf 类型,还是 Java 语言绑定(bind)提供的包装类型。

API 返回的对象使用三种主要类型表示:

  • Record
  • RecordField
  • Value .

  • 稍微简化一下, RecordRecordField 的列表, 一个 RecordField是一个标签和一个 ValueValue可以是许多事物之一,包括 Int64 , 一个 String , 一个 Record , 或 List .像 (Int, Text) 这样的元组在 DAML 中有特殊符号,但表示为正常 Record API 中的对象。

    假设您正在使用从 protobuf 定义编译的类型,并且已经掌握了 com.digitalasset.ledger.api.v1.ValueOuterClass.Value代表 [(Int, Text)] ,您需要执行以下操作:
  • 使用Value::getListValueOuterClass.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 的流接口(interface)巧妙地完成。显示的代码适用于原始 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());
    }
    }

    关于daml - 如何将通过 DA Ledger API 接收的 DAML 元组转换为 Java 对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53745950/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com