作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个生成元组列表的 DAML 模型,例如[(Int, Text)]
.我通过 DA Ledger API 收到这些数据 - 如何将其转换为 List<Pair<Long, String>>
在 Java 中?
最佳答案
Java 取决于您使用的是原始编译的 Protobuf 类型,还是 Java 语言绑定(bind)提供的包装类型。
API 返回的对象使用三种主要类型表示:
Record
RecordField
Value
. Record
是
RecordField
的列表, 一个
RecordField
是一个标签和一个
Value
和
Value
可以是许多事物之一,包括
Int64
, 一个
String
, 一个
Record
, 或
List
.像
(Int, Text)
这样的元组在 DAML 中有特殊符号,但表示为正常
Record
API 中的对象。
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>>
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/
我是一名优秀的程序员,十分优秀!