## Lazy Data Streams

A Lazy Data Stream is a mix between an iterator and a list. A stream can be expanded by lazy calculation of an extra member.

Streams is a key component of the declarative programming engine in ShapeLogic starting from ShapeLogic 1.0.

### Using streams to solve mathematical problems

Project Euler is a list of 178 mathematical problems that can be solved by computers. The first 10 mathematical problems have been solved in ShapeLogic using streams.

### History

Lazy Data Streams are used in different functional languages e.g.

### The advantages of a lazy data stream are

- That you can use functional techniques on possible infinite streams of data
- You still have access to previous elements in a calculation by an iterator
- You only calculate the necessary elements

### Examples of lazy infinite data streams

- Lazy Data Streams to calculate all Fibonacci numbers
- All even Fibonacci numbers
- All even Fibonacci numbers greater than 1000

### Definitions

**last** the last element of a stream, set to LAST_UNKNOWN, before it is know. This value can get lower as calculation progress.
**maxLast** manually set max value for last. The real last value might be lower.
**nullLegalValue** if this is false then the stream will end when the first null value is encountered.

### How can an calculation of stream end?

- If null is not a legal value when finding a null
- If an exception is thrown during a calculation
- By setting a top maxLast value

### How to iterate over a stream

#### For loop

Stream stream;
for (int i=0;
stream.getLast() != Constants.LAST_UNKNOWN || i <= stream.getLast();
i++)
{
stream.hasNext();
Object = stream.get(i);
}

#### While loop

Stream stream;
while (stream.hasNext())
{
Object stream.get(i);
}

### Stream hierarchy

There is a quite extensive hierarchy of streams. Here are the most important:

**Stream** top interface. Mainly just an Iterator.
**NumberedStream** interface. Stream that can be accessed with an index.
**ListStream** interface. Stream that stores result in a List.
**BaseListCommonStream** base class for most implementations.