This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Boolean isOdd(Integer number) => number % 2 != 0; | |
/** | |
sequence_demo prints | |
numbers=1..10 | |
oddNumbers={ 1, 3, 5, 7, 9 } | |
doubledNumbers={ 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 } | |
sumOfNumbers=55 | |
**/ | |
void sequence_demo() { | |
Integer[] numbers = 1..10; //here we use the range shortcut notation | |
print("numbers=``numbers``"); | |
Iterable<Integer> oddNumbers = numbers.filter(isOdd); | |
print("oddNumbers=``oddNumbers``"); | |
Iterable<Integer> doubledNumbers = numbers.map((Integer number) => number * 2); | |
print("doubledNumbers=``doubledNumbers``"); | |
Integer sumOfNumbers = numbers.fold(0, (Integer partial, Integer elem) => partial + elem); | |
print("sumOfNumbers=``sumOfNumbers``"); | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
Sequences are per definition nonempty and immutable. | |
Normally you would start out with the subtype Empty of Sequential (singleton instance empty) | |
But looking at the API of Empty we don't see any append or add methods | |
So how do we gradually build a sequence? | |
There are 2 classes which come to the rescue in this case | |
- SequenceBuilder (which has a no-arg constructor) => starts from empty. | |
- SequenceAppender (which takes a sequence as constructor parameter) => starts from non empty sequence | |
One should however carefully think about whether using a sequencebuilder or sequenceappender is | |
really necessary. Most of the times you start out from input which you just have to filter or map. | |
**/ | |
class Manager(shared String name) {} | |
void buildSequenceDemo() { | |
String[] names = ["John", "Peter", "Sammy"]; | |
Manager[] managers1 = createManagersFromNames(names); | |
//however, more idiomatic would have been | |
{Manager*} managers2 = names.map((String name) => Manager(name)); | |
//we can also use a comprehension | |
{Manager*} managers3 = {for (name in names) Manager(name)}; | |
//or if you really need a sequence instead of an iterable | |
Manager[] managers4 = names.map((String name) => Manager(name)).sequence; | |
//we can also use a comprehension | |
Manager[] managers5 = [for (name in names) Manager(name)]; | |
} | |
Manager[] createManagersFromNames(String[] names) { | |
SequenceBuilder<Manager> sb = SequenceBuilder<Manager>(); | |
for (name in names) { | |
sb.append(Manager(name)); | |
} | |
return sb.sequence; | |
} | |
void appendDemo() { | |
/** | |
Attention: code below does not work because you have to be explicit about | |
names1 being a NON EMPTY sequence | |
**/ | |
//String[] names1 = ["John", "Peter", "Sammy"]; | |
[String+] names1 = ["John", "Peter", "Sammy"]; | |
String name = "Ronald"; | |
String[] combined = SequenceAppender(names1).append(name).sequence; | |
} | |
No comments:
Post a Comment