কিছুটা সাময়িক বিষয় হতে পারে তবে আমাদের এটির List<T>
পরিবর্তে যা আছে তা Stream<T>
।
প্রথমে আপনার একটি ব্যবহার take
পদ্ধতি থাকা দরকার। এই পদ্ধতিতে প্রথম n
উপাদানগুলি লাগে :
static <T> List<T> take(List<T> l, int n) {
if (n <= 0) {
return newArrayList();
} else {
int takeTo = Math.min(Math.max(n, 0), l.size());
return l.subList(0, takeTo);
}
}
এটা ঠিক মত কাজ করে scala.List.take
assertEquals(newArrayList(1, 2, 3), take(newArrayList(1, 2, 3, 4, 5), 3));
assertEquals(newArrayList(1, 2, 3), take(newArrayList(1, 2, 3), 5));
assertEquals(newArrayList(), take(newArrayList(1, 2, 3), -1));
assertEquals(newArrayList(), take(newArrayList(1, 2, 3), 0));
এখন এটি takeWhile
উপর ভিত্তি করে একটি পদ্ধতি লিখতে মোটামুটি সহজ হবেtake
static <T> List<T> takeWhile(List<T> l, Predicate<T> p) {
return l.stream().
filter(p.negate()).findFirst(). // find first element when p is false
map(l::indexOf). // find the index of that element
map(i -> take(l, i)). // take up to the index
orElse(l); // return full list if p is true for all elements
}
এটি এর মতো কাজ করে:
assertEquals(newArrayList(1, 2, 3), takeWhile(newArrayList(1, 2, 3, 4, 3, 2, 1), i -> i < 4));
এই প্রয়োগটি কয়েকবার তালিকাটিকে আংশিকভাবে পুনরাবৃত্তি করে তবে এটি অ্যাড O(n^2)
অপারেশন যুক্ত করে না। আশা করি তা গ্রহণযোগ্য।