Comfortable arrays
Arrays in JavaFX are easy-to-use and act more like sequences. Here’s one:
var letters = ['A', 'B', 'D'];
Let’s print it,
println(letters);
![]()
get its size,
println(sizeof letters);
![]()
reverse it,
println(reverse letters);
insert an element at the end,
insert 'E' into letters; println(letters);
insert more elements at the end,
insert ['F', 'G'] into letters; println(letters);
and insert something at the middle.
insert 'C' after letters[1]; println(letters);
![]()
To delete any element you may specify its value,
delete 'E' from letters; println(letters);
or index.
delete letters[2]; println(letters);
Finally, you may delete all elements with
delete letters; println(letters);
![]()
Powerful selection
Here’s an array of various numbers.
var numbers = [78, 44, 21, 7, 90, 4, 18];
Let’s print those that are strictly smaller than 10,
println(numbers[n | n < 10]);
Note: | means where and n is an arbitrary variable name according to the developer’s taste.
Here’s how to select the elements between 20 and 50,
println(numbers[n | 20 <= n and n <= 50]);
select only the even elements,
println(numbers[n | n mod 2 == 0]);
a sublist,
println(numbers[2..4]);
and a tail list.
println(numbers[4..]);
Arrays as ranges
Check this out.
var numbers = [1..10]; println(numbers);
To ommit the last value, simply add a <.
var numbers = [1..<10]; println(numbers);
Here are the multiples of 17 up to 100.
var multiples = [0..100][n | n mod 17 == 0];
Alternatively,
var multiples = [0..100 step 17];
Utilities
Such a prominent data structure should be accompanied by a set of utilities. The equivalent of java.util.Arrays is here javafx.util.Sequences.
It provides a rich toolset for searching, sorting, finding the minimum and maximum values. Of course, all this functionality is based on the natural order (Comparable) or a custom order (Comparator).
For example, we’re developing a game.
class Player {
var name: String;
var age: Integer;
}
It’s good to provide a proper toString() implementation.
class Player {
var name: String;
var age: Integer;
override function toString(): String {
return name;
}
}
Let’s define a natural order. For a player, his age makes sense.
class Player extends Comparable {
var name: String;
var age: Integer;
override function toString(): String {
return name;
}
override function compareTo(other: Object): Integer {
return age - (other as Player).age;
}
}
Here are a few of them…
var players = [
Player {name: 'Madonna' age: 56},
Player {name: 'Katie Perry' age: 24},
Player {name: 'Jennifer Lopez' age: 38}];
Let’s print them,
println(players);
![]()
and sort them.
println(Sequences.sort(players));
![]()
The powerful selectors do apply here as well.
println(players[p | p.age > 30]);
![]()
println(players[p | p.name.startsWith('M')]);
![]()
Before moving on, let’s try to modify the Player class a bit.
class Player extends Comparable<Player> { var name: String; var age: Integer; override function compareTo(other: Player): Integer { return age - other.age; } }
Compilation fails, because JavaFX does not yet support generic parameters.
Enhanced for loop
The enhanced for loop of Java is here.
for (player in players) {
player.move();
}
At a first glance, just the keyword in is introduced. But there’s more.
Make statistics out of the players’ ages :
var ages = for (player in players) player.age; println(ages);
Quickly get a list of the players’ names :
var activePlayers = for (player in players) player.name; println(activePlayers);
Get their names in capital letters :
var listPlayers = for (player in players) player.name.toUpperCase(); println(listPlayers);
Actually you may get an array from any loop, if the last statement returns something.
var array = for (number in [1..100]) {
// more statements
Math.sin(number);
}
Even the following is valid.
var array = for (number in [1..100]) {
// more statements
number;
}
This feature is useful for fast graphics transformations.
var cubes = for (number in [1..100]) number * number * number;
As an addition to Java, protection is provided for the parameter; it’s value cannot be altered.
for (number in [1..10]) {
// compilation fails
number = number + 2;
}
Strings and formatting
Strings may be declared with single quotes as well. The following initializations are all valid.
var text1 = "Create ";
var text2 = 'richer ';
var text3 = new String("internet ");
var text4 = new String('applications.');
Here’s a complete sentence with some Java chaining,
var sentence = text1.concat(text2).concat(text3).concat(text4);
or a StringBuilder.
sentence = new StringBuilder(text1).append(text2).append(text3).append(text4).toString();
Fortunately, the plus operator for strings is well deprecated.
sentence = text1 + text2 + text3 + text4; // compilation fails
Even better, a new feature is here.
var number = 10;
println("A number: {number}");
What’s between the braces gets evaluated.
var number = 10;
println("It's square: {number * number}");
So these statements in Java,
int amount = 7;
String status = String.format("%d dollars left.", amount);
System.out.format("If only I had %d!\n", 1000 * amount);
in JavaFX would be:
var amount = 7;
var status = "{amount} dollars left.";
println("If only I had {1000 * amount}!");
More examples.
sentence = "{text1}{text2}{text3}{text4}";
println(sentence);
![]()
sentence = "Visualise {text2}{text3}{text4}";
println(sentence);
![]()
sentence = "Visualise {text2.toUpperCase()}{text3}{text4}";
println(sentence);
![]()
sentence = "Visualise {text2.toUpperCase()}{text3}{if (true) 'experiences.' else text4}";
println(sentence);
![]()
Wrap up
In JavaFX casting is provided by the "as" keyword. Also, "extends" is used for any IS-A relationship.
class Child extends Parent, Comparable {
// implementation
}
Consider this small sequence.
var letters = ['A', 'B', 'D'];
JavaFX provides compile-time type safety for arrays. For example, this fragment will not compile successfully.
// assigning an Integer to a String letters[0] = 100; // inserting an Integer to a String[] insert 100 into letters;
On the other hand, JavaFX gracefully handles some common unchecked exceptions. Consider this example:
// exceeding the bounds of an array
println(letters[100]);
delete letters[100];
letters[100] = 'Z';
println("No exception is thrown!");
The last part of this series will focus on two brand-new features of JavaFX Script.
Thank you.
Tags: JavaFX
8 February 2009 at 12:58 pm
Συγχαρητήρια για το blog! Μήπως μπορείς να φτιάξεις κανένα καλό mailbomber ή invisible keylogger να γουστάρουμε? Για παράδειγμα ένα άπλετ που όποιος το τρέχει να καταγράφονται όλα τα keystrokes του και να αποστέλλονται με email. Απ ότι βλέπω υπάρχουν ήδη κάποιες πρώτες αξιολογες προσπάθειες http://www.google.gr/search?hl=el&q=java+keylogger&meta=&aq=f&oq= Keep up the good work!
11 February 2009 at 5:49 pm
This is a great intro to JavaFX Sequences! Thanks!
20 February 2009 at 9:17 pm
[...] Introduction to the JavaFX language: part1 and part2 [...]