我有一个 JoinRowSet (jrs) 和 TreeMap (finalTM)。我在 TreeMap 的键上有一个 for-loop 循环,对于每个键,我想使用 Java 8 lambda 表达式从 JoinRowSet 中获取该列等于 TreeMap 键值的记录。for 循环上的 lambda 表达式返回一个 ArrayList。我需要将这些 ArrayLists 的值添加到新的 CachedRowSet(或 JoinRowSet)。我在 lambda 表达式上尝试了其他返回类型,但我遇到了更多问题。
我的 JoinRowSet 必须转换为 Collection 才能与 lambda 表达式一起使用,并且集合上的每条记录都必须具有 Row 类型,因为它要在不同的应用程序中使用,因此它不能有特定于应用程序的类。
对此的任何意见将不胜感激。谢谢你。
这是我的代码:
List dataList = new ArrayList();
Collection<Row> filteredDataArr = (Collection<Row>) jrs.toCollection();
for (Map.Entry<String,Integer> entry : finalTM.entrySet()) {
String key = entry.getKey();
dataList = filteredDataArr.stream()
.filter(u -> {
try {
return ((u.getColumnObject(thisColIdxToGroupBy).toString()).equals(key));
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
)
.collect(Collectors.toList())
;
System.out.println("#recs: " + dataList.size());
}
更新:我找到了一种通过 ArrayList 循环并使用 CachedRowSet 中的 insertRow 方法的方法。我不确定这是否是最有效的方法。
CachedRowSet finalCRS = new CachedRowSetImpl();
finalCRS.setMetaData((RowSetMetaData) jrs.toCachedRowSet().getMetaData());
if (dataList != null && dataList.size() > 0) {
for (Object rec : dataList) {
finalCRS.moveToInsertRow();
for (int j = 1; j <= finalCRS.getMetaData().getColumnCount(); j++) {
String dataType = finalCRS.getMetaData().getColumnTypeName(j);
if (dataType.equals("NUMBER")) {
finalCRS.updateBigDecimal(j, (BigDecimal) ((Row)rec).getColumnObject(j));
} else if (dataType.equals("VARCHAR2")) {
finalCRS.updateString(j, (String) ((Row)rec).getColumnObject(j));
} else if (dataType.equals("DATE")) {
finalCRS.updateTimestamp(j, (Timestamp) ((Row)rec).getColumnObject(j));
}
}
finalCRS.insertRow();
finalCRS.moveToCurrentRow();
}
}