java是否具有与arraylists相当的mysql限制和偏移量?

时间:2018-06-10 18:09:46

标签: java mysql list limit offset

在MySQL中你可以这样做:

select * from sometable order by id desc limit 3 offset 0; 

哪会返回前3个结果。如何在java中实现这样的东西?

如果我有一个奇数元素的ArrayList

ArrayList<String> ids = new ArrayList<String>();
ids.add("1");
ids.add("2");
ids.add("3");
ids.add("4");
ids.add("5");
ids.add("6");
ids.add("7");
ids.add("8");
ids.add("9");
ids.add("10");
ids.add("11");

如果每个偏移量只从这个ArrayList获得3个结果(如果没有剩余的元素,则小于3)?

例如,假设限制始终为3且offset = 0

  

它应吐出1,2,3

if offset = 3

  

4,5,6

offset = 6

  

7,8,9-

offset = 9

  

10,11

我目前的方式是创建列表的子列表:

int endOf = offset+3;
ArrayList<String> ids2 = new ArrayList<String>(ids.subList(offset, endOf));

但是当偏移量大于ids的大小时它就会中断......

如果使用arraylists无法做到这一点,还有更好的方法吗?

修改

根据这两个答案,安迪的方法似乎表现得更好:

long startTime = System.nanoTime();
 //tried each method here
long stopTime = System.nanoTime();
System.out.println(stopTime - startTime);

没有溪流:

40960
17167
13854
10240

使用流:

303584
118060
47284
40357

EDIT2:

绝不应该依赖上面的基准测试。有关详细信息,请参阅此处:How do I write a correct micro-benchmark in Java?

3 个答案:

答案 0 :(得分:4)

只需钳制subList的参数:

list.subList(
    Math.min(list.size(), offset),
    Math.min(list.size(), offset + limit))

如果您发现语法不方便,请编写辅助方法,例如

<T> List<T> clampedSublist(List<T> list, int offset, int limit)

答案 1 :(得分:2)

这可以通过流来完成:

List<Integer> result = 
    ids.stream()
       .skip(0)  // Equivalent to SQL's offset
       .limit(3) // Equivalent to SQL's limit
       .collect(Collectors.toList());

答案 2 :(得分:0)

List<Integer> result = 
    ids.stream()
       .skip(0)  // Equivalent to SQL's offset
       .limit(3) // Equivalent to SQL's limit
       .collect(Collectors.toList());

跳过应该是pagenolimit