Lazy lists?
Millies, Sebastian
Sebastian.Millies at softwareag.com
Wed Oct 9 04:43:06 PDT 2013
Hello Paul,
thanks for that example (although it computes the primes in the range up to 100, not the first 100 primes).
First time I see flatMap in action.
My code was intended only as an example, I am aware of O'Neills paper. I still think having lazy collections
would be nice. Your last sentence suggests you view them as an alternative to persistent collections. Or is
that an over-interpretation?
-- Sebastian
-----Original Message-----
From: lambda-dev-bounces at openjdk.java.net [mailto:lambda-dev-bounces at openjdk.java.net] On Behalf Of Paul Sandoz
Sent: Wednesday, October 09, 2013 12:22 PM
Cc: lambda-dev at openjdk.java.net
Subject: Re: Lazy lists?
Hi Milles,
We avoided adding operation-based methods to collections themselves which would have made them lazy due to, in part, the complexity that it introduced to the implementation. So rather than a lazy data structure we opted for different abstraction we call Stream.
The approach of the specific example you present is falling into similar traps as discussed in [1] on trial division, and as such it is, IMHO, not a particular compelling reasons why lazy lists are needed.
Note: we are missing some operations on stream, such as limitWhen (or takeWhile) that would be useful for the trial division use-case.
Here is another way:
Map<Integer, LinkedList<Integer>> m = new TreeMap<>();
Function<Integer, LinkedList<Integer>> newList = (k) -> new LinkedList();
IntStream.range(2, 100).forEach(x -> {
if (!m.containsKey(x)) {
// Always absent, just shorter expression
m.computeIfAbsent(x * x, newList).push(x);
}
else {
m.remove(x).forEach(p -> m.computeIfAbsent(x + p, newList).push(p));
}
});
List<Integer> primes = m.values().stream().flatMap(List::stream).collect(toList());
System.out.println(primes);
Obviously that is not parallelizable and of course it is not lazy, but then Java is not Haskell (for better or worse depending on one's opinion).
I think there are far more compelling reasons to add persistent collections to Java.
Paul.
[1] http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf
On Oct 9, 2013, at 9:00 AM, "Millies, Sebastian" <Sebastian.Millies at softwareag.com> wrote:
> Hello there,
>
> now that we have infinite Streams, wouldn’t it be worthwhile to have a
> lazy list implementation in the collection library? By Lazy list, I
> mean a list that would be strict for the head and lazy for the tail in
> that it
>
> a) could be based on a Function<T> to generate the elements in the tail
> in sequence (like Stream#iterate())
> b) would accept a Supplier<LazyList<T>> to supply a tail (like
> Stream#generate())
> c) would accept a Predicate<T> to filter out non-matching elements
> from the tail
> d) would allow constant time access to the head.
>
> It would stream() using a spliterator of unknown size.
>
> With it, we could write code somewhat like this to generate the first
> 100 primes by trial division (where cons is also a static factory methof of LazyList):
>
> LazyList<Integer> s = sieve(LazyList.newList(2, x -> x + 1));
> s.stream().limit(100).forEach(x->System.out.print(x + " "));
>
> private LazyList <Integer> sieve(LazyList <Integer> s) { Integer p =
> s.head(); return cons(p, () -> sieve(s.tail().filter(x -> x % p !=
> 0))); }
>
> Which would be pretty neat. Any particular reason – now that we have
> lambdas – that there are no lazy data structures in the library?
>
>
> n Sebastian
>
> Software AG – Sitz/Registered office: Uhlandstraße 12, 64297
> Darmstadt, Germany – Registergericht/Commercial register: Darmstadt
> HRB 1562 - Vorstand/Management Board: Karl-Heinz Streibich
> (Vorsitzender/Chairman), Dr. Wolfram Jost, Arnd Zinnhardt; -
> Aufsichtsratsvorsitzender/Chairman of the Supervisory Board: Dr.
> Andreas Bereczky - http://www.softwareag.com
>
>
Software AG – Sitz/Registered office: Uhlandstraße 12, 64297 Darmstadt, Germany – Registergericht/Commercial register: Darmstadt HRB 1562 - Vorstand/Management Board: Karl-Heinz Streibich (Vorsitzender/Chairman), Dr. Wolfram Jost, Arnd Zinnhardt; - Aufsichtsratsvorsitzender/Chairman of the Supervisory Board: Dr. Andreas Bereczky - http://www.softwareag.com
More information about the lambda-dev
mailing list