问题是在这里问的:https://vaadin.com/forum/thread/18095407/how-to-create-a-grid-without-binder
但是 vaadin 的论坛已经关闭,所以我想在这里继续。
在 Vaadin 14 上,关于实现具有动态可变列数的网格的最佳方法的任何建议。使用列 Index (1,2,3...) 对我来说不是一个好的选择。假设我有一个简单的 Json 文件(只有 1 个级别:键值)来映射到网格,而这个 Json 有一个未知的属性列表。
哪种方法在性能方面更好?:
[选项 1]
class Data {
private Map<String, Object> values = new HashMap<>();
public void set(String key, Object val) {
values.put(key, val);
}
public Object get(String key) {
return values.get(key);
}
}
Grid<Data> myGrid = new Grid<>();
[选项 2]
public class GridDynamicValueProvider implements ValueProvider<GridDynamicRow, Object> {
private int columnIndex;
public GridDynamicValueProvider(int columnIndex) {
this.columnIndex = columnIndex;
}
@Override
public Object apply(GridDynamicRow dynamicRow) {
return dynamicRow.getValue(columnIndex);
}
}
public class GridDynamicRow {
private List<Object> values = new ArrayList<>();
public void addValue(String value) {
values.add(value);
}
public Object getValue(int columnIndex) {
return values.get(columnIndex);
}
}
答案 0 :(得分:4)
Vaadin 的 SerializablePredicate 接受函数引用和 Lambda,因此可以在 Vaadin 中使用 non-POJO data types with Grid and Binder,尽管这有点不合常规。主要成分是:
Grid<Map<String, Integer>> grid = new Grid<>();
...
grid.addColumn(map -> map.get("column")).setHeader("Column");
如果您需要保护内部结构,您也可以将 Map 包装在自定义类中。
class Data {
private Map<String, Object> values = new HashMap<>();
public void set(String key, Object val) {
values.put(key, val);
}
public Object get(String key) {
return values.get(key);
}
}
Grid<Data> myGrid = new Grid<>();
至于性能,本质上,您是在使用按索引获取的 List 与按键获取的 HashMap 进行比较。这是一个相关的问题:ArrayList .get faster than HashMap .get?
如果可以用数字索引列,也可以使用 ArrayList as Grid's type。
这两种方法都允许生成具有不同动态列数的网格,例如,如果您直接从文件读取数据或具有原始数据后端查询。