我想从后端延迟加载过滤后的数据。如果我应用了一个从后端返回1个元素的过滤器(或者没有应用过滤器),那么所有的工作都很好。
如果提取的项大于1,它将开始崩溃/抛出OutOfboundsException
。我使用了官方的Vaadin文档作为实现的指南。
在Stream-API的.filter()
方法中引发异常。我也知道异常的含义,试图访问值的索引是>=列表的最大大小,但我不确定如何解决这个问题。将第一个查询的限制设置为limit-1并不能解决此问题。
我想我在回调中的第二个查询做错了,但我不知道问题是什么。是Stream-API问题还是第二个回调查询不能正常工作?
public DataProvider<T, String> createLazyLoadingProvider(List<T> data) {
DataProvider<T, String> lazyLoadingProvider
= DataProvider.fromFilteringCallbacks(query -> {
// First Query
final int offset = query.getOffset();
final int limit = query.getLimit();
final String filter = query.getFilter().orElse("");
return data
.stream()
.skip(offset)
.limit(limit)
.filter(e -> {
return e.toString().startsWith(filter);
});
}, query -> {
// Second query
return (int) data.stream()
.filter(e -> {
return e.toString().startsWith(filter);
})
.count();
});
return lazyLoadingProvider;
}
产生:
First Query
Offset: 0
Limit: 100
Callback-Filter: 3
Full Size of Data: 6005
From backend fetched Items: 5
-----------
Second Query
Offset: 0
Limit: 2147483647
Callback-Filter: 3
Max fetchable Items with filter applied: 381
堆栈跟踪:
null
您需要在应用偏移量和限制之前进行筛选。
精化:
假设您有苹果、cucumber、柠檬、生菜、亚麻籽、酸橙、橘子、番茄
项,并且希望过滤器只包含以L
开头的项。
count查询返回4的计数(Lemon,Lettuce,Lonseed,Lime
)。
现在假设网格需要前两项,所以它发送偏移量0和限制2。
您的代码所做的是选择前两个项目苹果,cucumber
,然后过滤它们,并返回0个项目。
它需要做的是对项目进行过滤,得到柠檬,莴苣,亚麻籽,酸橙
,然后取偏移量0,限制2,得到柠檬,莴苣
。
本文向大家介绍Java8中使用流方式查询数据库的方法,包括了Java8中使用流方式查询数据库的方法的使用技巧和注意事项,需要的朋友参考一下 由于关系型数据库操作语言和面向对象语言之间的差异,如今我们仍然需要花费许多时间建立数据库与 Java 应用之间互相沟通的桥梁。通常,我们可以编写自己的映射层(mapping layer),或者使用第三方的 ORM(Object Relational Mappe
例如,对于{A,B}和{X,Y}这两个流,我希望它生成值流{AX,AY,BX,BY}(简单的串联用于聚合字符串)。到目前为止,我已经想出了这段代码: 这是我想要的用例: 预期结果:。 溪流消耗在哪里?按平面地图?很容易修好吗?
我有以下几门课: 我有一个物品清单。我想遍历列表并找到具有特定ID的实例。我试着通过溪流来做。
我试图列出整数列表中的重复元素,例如, 使用jdk 8的流。有人试过吗?要删除重复项,我们可以使用distinct() api。但是如何找到重复的元素呢?有人能帮我吗?
假设您有一个第三方库,它公开了下一个接口。 代码无法编译,因为Function不知道如何处理由domap声明的CheckedException。我想出了两个可能的解决方案。 解决方案#1-包装调用 解决方案#2-编写实用程序方法