当前位置: 首页 > 知识库问答 >
问题:

使用Java 8流的DataProvider查询中的IndexOutOfBoundsException

廖华翰
2023-03-14

我想从后端延迟加载过滤后的数据。如果我应用了一个从后端返回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

共有1个答案

俞学
2023-03-14

您需要在应用偏移量和限制之前进行筛选。

精化:

假设您有苹果、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-编写实用程序方法