Итак, есть несколько уровней проблем с тем, что вы пытаетесь сделать.
Вы говорите: «практичность - не аргумент», и это нормально, но позвольте мне отметить, что Long.MAX_VALUE
превышаетколичество атомов на земле, так что вероятность того, что вы получите больше записей, чем из базы данных, очень мала.Не говоря уже о том, что вы продолжаете собирать эти данные в список, чтобы вы могли столкнуться с проблемами памяти и в своем собственном приложении.
Итак, во-вторых, семантика limit()
заключается в том, что она налагаетфиксированный лимит на количество записей и «бесконечность» не является фиксированным лимитом;следовательно, limit()
просто не то, что вы ищете.
В-третьих, вы, кажется, ищете способ обойти это, поэтому у нас есть шаблон, который вы можете использовать, и это поддерживает ваш собственный счетчик.То, что вы хотите, это что-то вроде AtomicBigInteger
, которого нет в JDK , но показано здесь .
Итак, вы бы создали Predicate
, как это
class BelowValue<T> implements Predicate<T> {
BigInteger limit = BigInteger.ZERO;
AtomicBigInteger counter = new AtomicBigInteger();
public BelowValue(BigInteger limit) {
this.limit = limit;
}
public BelowValue() {}
public boolean test(T ignored) {
// short circuit on zero
if (BigInteger.ZERO.compareTo(limit) == 0) { return true; }
// check actual condition
return counter.incrementAndGet().compareTo(limit) > 0;
}
}
и затем вы можете использовать его в своем потоке с (Java 8)
Predicate<T> filter = new BelowValue<>(limit);
return stream
.filter(filter)
.boxed()
.collect(Collectors.toList());
Обратите внимание, однако, что filter
является , а не операцией короткого замыкания, так что если у вас есть бесконечный поток, это не прекратится (и будет очень неэффективным, если ваш поток намного длиннее, чем предельный размер).
Java 9 takeWhile
имеет короткое замыкание, поэтому вы можете заменитьчто для filter
в приведенном выше примере.