Home
Xtend User Guide
Contents
1. 36 6 6 1 Property Access If there is no field with the given name and also no method with the name and zero parameters accessible a simple name binds to a corresponding Java Bean getter method if available myObj myProperty myObj getMyProperty in case myObj myProperty is not visible 6 6 2 Implicit Variables this and it Like in Java an instance of the class is bound to this Which allows for either qualifying field access or method invocations like in this myField or omit the receiver myField You can use the variable name it to get the same behavior for any variable or param eter val it new Person name Horst translates to it setName Horst Another speciality of the variable it is that it can be shadowed This is especially useful when used together with lambda expressions 6 8 As this is bound to the surrounding object in Java it can be used in finer grained constructs such as lambda expressions 6 8 That is why it myProperty has higher precedence than this myProperty 6 6 3 Static Access For accessing a static field or method you have to use the double colon like in this example MyClass myField MyClass myMethod foo 37 Alternatively you could import the method using a static import 85 2 6 6 4 Null Safe Feature Call Checking for null references can make code very unreadable In many situations it is ok for an expression to return null if
2. Unlike other JVM languages Xtend has zero interoperability issues 4 3 with Java Everything you write interacts with Java exactly as expected At the same time Xtend is much more concise readable and expressive Xtend s small library is just a thin layer that provides useful utilities and extensions on top of the Java Development Kit JDK Of course you can call Xtend methods from Java too in a completely transparent way Furthermore Xtend provides a modern Eclipse based IDE closely integrated with Eclipse s Java Development Tools JDT including features like call hierarchies rename refactoring debugging and many more 2 Hello World The first thing you want to see in any language is a Hello World example In Xtend that reads as class HelloWorld def static void main String args 4 printin Hello World You see that Xtend looks a lot like Java At a first glance the main difference seems to be the def keyword to declare a method Also like in Java it is mandatory to define a class and a main method as the entry point for an application Admittedly hello world programs are not a particular strength of Xtend The real expressiveness is unleashed when you do real stuff as you will learn in a second An Xtend class resides in a plain Java project As soon as the SDK is installed Eclipse will automatically translate it to Java code By default you will find it in a source folder xtend gen which is of cours
3. The most simple class looks like this class MyClass A more advanced generic class declaration in Xtend class ArrayList lt E gt extends AbstractList lt E gt implements List lt E gt RandomAccess Cloneable java io Serializable 18 5 4 Constructors An Xtend class can define one or more constructors Unlike Java you do not have to repeat the name of the class over and over again but use keyword new to declare a constructor Constructors can also delegate to other constructors using this args in their first line class MyClass extends AnotherClass new String s super s new this default The same rules with regard to inheritance apply as in Java i e if the super class does not define a no argument constructor you have to explicitly call one using super args as the first expression in the body of the constructor The default visibility of constructors is public but you can also specify protected or private 5 5 Fields A field can have an initializer Final fields are declared using val while var introduces a non final field and can be omitted Yet if an initializer expression is present the type of a field can be skipped after val and var Fields marked as static will be compiled to static Java fields class MyClass int count 1 static boolean debug false var name Foo type String is inferred val UNIVERSAL_ ANSWER 42 final field with inferred type int The defau
4. The 45 downside with the guillemets in Xtend is that you will have to have a consistent encoding Always use UTF 8 and you are good If you use the Eclipse plug in which is recommended the guillemets will be inserted on content assist within a template They are additionally bound to CTRL SHIFT lt and CTRL SHIFT for and respectively On a Mac they are as well bound to alt q and alt Q Let us have a look at an example of how a typical method with a template expressions looks like def someHTML String content lt html gt lt body gt content lt body gt lt html gt 1 As you can see template expressions can be used as the direct body of a method If an interpolation expression evaluates to null an empty string is added Template expressions can occur everywhere Here is an example showing it in con junction with the powerful switch expression 86 10 def toText Node n switch n Contents n text A lt a href n href gt n applyContents lt a gt default lt n tagName gt n applyContents lt n tagName gt 1 i 6 17 1 Conditions in Templates There is a special IF to be used within templates def someHTML Paragraph p 46 lt html gt lt body gt IF p headLine null lt h1 gt p headline lt h1 gt ENDIF lt p gt p text lt p gt lt body gt lt html gt 6 17 2 Loops in Templates Also a
5. A a la Ee ees A 45 se atts leads ve D RS 46 ee cette a ete ays ae ee eee do 47 6 17 3 Typing os s oe eee OR Naam sb phase des pue 48 6 17 4 White Space Handling Y Processed Annotations EL Propertyy is da a a is Sie ee Oe estime CANA ns ne de Boa Al vpn oe Gi cero Gi oe Ae PTR Ps Part I Getting Started 1 Introduction Xtend is a statically typed programming language which translates to comprehensible Java source code Syntactically and semantically Xtend has its roots in the Java pro gramming language but improves on many aspects Extension methods 5 8 enhance closed types with new functionality Lambda Expressions 86 8 concise syntax for anonymous function literals Operator overloading 66 3 make your libraries even more expressive Powerful switch expressions 6 10 type based switching with implicit casts Multiple dispatch 65 6 6 a k a polymorphic method invocation Template expressions 6 17 with intelligent white space handling No statements 6 everything is an expression Properties 6 6 1 shorthands for accessing and defining getters and setter e Local type inference you rarely need to write down type signatures anymore e Full support for Java Generics including all conformance and conversion rules e Translates to Java not bytecode understand what is going on and use your code for platforms such as Android or GWT
6. The return type of a for loop is void The type of the local variable can be left out In that case it is inferred from the type of the array or java lang Iterable returned by the iterable expression for String s myStrings 4 doSideEffect s for s myStrings doSideEffect s 6 12 While Loop A while loop while predicate expression is used to execute a certain expression unless the predicate is evaluated to false The return type of a while loop is void while true doSideEffect foo while i i 1 lt max doSideEffect foo 43 6 13 Do While Loop do while loop do expression while predicate is used to execute a certain expression until the predicate is evaluated to false The difference to the while loop 6 12 is that the execution starts by executing the block once before evaluating the predicate for the first time The return type of a do while loop is void do doSideEffect foo while true do doSideEffect foo while i i 1 lt max 6 14 Return Expression A method or lambda expression automatically returns the value of its expression If it is a block expression 6 4 this is the value of the last expression in it However sometimes you want to return early or make it explicit The syntax is just like in Java listOfStrings map e if e null return NULL e toUpperCase 6 15 Throwing Exceptions Throwing Throwables up the call stack
7. has the same semantics and syntax as in Java if myList isEmpty A4 throw new IllegalArgumentException the list must not be empty 6 16 Try Catch Finally The try catch finally expression is used to handle exceptional situations Checked ex ceptions are treated like runtime exceptions You can but do not have to catch them as they will be silently thrown see the section on declared exceptions 65 6 3 The syntax again is like Java try throw new RuntimeException catch NullPointerException e handle e finally do stuff For try catch it is again beneficial that it is an expression because you can write code like the following and do not have to rely on non final variables val name try person name catch NullPointerException e no name 6 17 Template Expressions Templates allow for readable string concatenation Templates are surrounded by triple single quotes A template expression can span multiple lines and expressions can be nested which are evaluated and their toString representation is automatically inserted at that position The terminals for interpolated expression are so called guillemets expression They read nicely and are not often used in text so you seldom need to escape them These escaping conflicts are the reason why template languages often use longer character sequences like e g lt expression gt in JSP for the price of worse readability
8. is evaluated 1 Indentation in the template that is relative to a control structure will not be propagated to the output string A control structure is a FOR loop or a condition IF as well as the opening and closing marks of the template string itself The indentation is considered to be relative to such a control structure if the previous line ends with a control structure followed by optional white space The amount of white space is not taken into account but the delta to the other lines 2 Lines that do not contain any static text which is not white space but do contain control structures or invocations of other templates which evaluate to an empty string will not appear in the output 3 Any newlines in appended strings no matter they are created with template ex pressions or not will be prepended with the current indentation when inserted Although this algorithm sounds a bit complicated at first it behaves very intuitively In addition the syntax coloring in Eclipse communicates this behavior The behavior is best described with a set of examples The following table assumes a data structure of nested nodes 48 def someHTML List lt Paragraph gt paragraphs lt html gt lt body gt FOR p IF p headline null lt hi gt p headline lt hi gt ENDIF lt p gt p text lt p gt ENDFOR lt body gt lt html gt 111 Figure 6 1 Syntax Coloring For Templates In Eclipse class Templat
9. or a BigDecimal suffix BD If you use a you have to specify both the integer and the fractional part of the mantissa There are only decimal floating point literals 42d double 0 42e2 implicit double 0 42e2f float 4 2f float 0 123 456 789 123 456 789 123 456 789e2000bd BigDecimal 6 1 3 Boolean Literals There are two boolean literals true and false which correspond to their Java counterpart of type boolean 6 1 4 Null Literal The null pointer literal null has exactly the same semantics as in Java 6 1 5 Type Literals Type literals are specified using the keyword typeof typeof java lang String yields java lang String class 31 6 2 Type Casts A type cast behaves exactly like casts in Java but has a slightly more readable syntax Type casts bind stronger than any other operator but weaker than feature calls The conformance rules for casts are defined in the Java Language Specification Here are some examples something as MyClass 42 as Integer Although casts are supported you might want to use alswitch with a type guard 6 10 or aldispatch method 85 6 6 as a better and safer alternative 6 3 Infix Operators and Operator Overloading There are a couple of common predefined infix operators In contrast to Java the operators are not limited to operations on certain types Instead an operator to method mapping allows users to redefine the operators for any type just by imple
10. your application You might for instance not want to put Ul specific methods and dependencies to your domain model classes Therefore such functionality is often defined in static methods or methods in some service class That works but the code is less readable and less object oriented if you call methods like this In Java for instance you often see code like this 26 persistenceManager save myObject Without tying your entities to the persistenceManager extension methods allow you to write myObject save There are different ways to make methods available as extensions which are described in the following 5 8 1 Extensions From The Library The library puts a lot of very useful extension methods on existing types from the Java SDK without any further ado hello toFirstUpper calls StringExtensions toFirstUpper String listOfStrings map toUpperCase calls ListExtensions lt T R gt map List lt T gt list Function lt super T extends R gt Have a look at the JavaDoc to see what is there e ObjectExtensions e IterableExtensions e MapExtensions e ListExtensions e CollectionExtensions e BooleanExtensions e IntegerExtensions e FunctionExtensions 27 5 8 2 Local Extension Methods All visible non static methods of the current class and its super types are automatically available as extensions For example class MyClass def doSomething Object obj do something with obj def extensionCall
11. FOR statement is available 1 def someHTML List lt Paragraph gt paragraphs lt html gt lt body gt FOR p paragraphs IF p headLine null lt h1 gt p headline lt h1 gt ENDIF lt p gt p text lt p gt ENDFOR lt body gt lt html gt 1 The for statement optionally allows to specify what to prepend BEFORE put in between SEPARATOR and what to put at the end AFTER of all iterations BE FORE and AFTER are only executed if there is at least one iteration SEPARATOR is only added between iterations that it is executed if there are at least two iterations Here is an example def someHTML List lt Paragraph gt paragraphs lt html gt lt body gt FOR p paragraphs BEFORE lt div gt SEPARATOR lt div gt lt div gt AFTER lt div gt IF p headLine null lt h1 gt p headline lt h1 gt 47 ENDIF lt p gt p text lt p gt ENDFOR lt body gt lt html gt 1 6 17 3 Typing The template expression is of type CharSequence It is automatically converted to String if that is the expected target type 6 17 4 White Space Handling One of the key features of templates is the smart handling of white space in the tem plate output The white space is not written into the output data structure as is but preprocessed This allows for readable templates as well as nicely formatted output The following three rules are applied when the template
12. Object obj obj doSomething calls this doSomething obj Local static methods have to be made available through an import like any other static method 5 8 3 Extension Imports In Java you would usually write a helper class with static methods to decorate an existing class with additional behavior In order to integrate such static helper classes Xtend allows to put the keyword extension after the static keyword of a static import 65 2 thus making all imported static functions available as extensions methods The following import declaration import static extension java util Collections allows to use its methods like this new MyClass singletonList calls Collections singletonList new MyClass 5 8 4 Extension Fields By adding the extension keyword to a field declaration its instance methods become extension methods Imagine you want to have some layer specific functionality on a class Person Let us say you are in a servlet like class and want to persist a Person using some persistence mechanism Let us assume Person implements a common interface Entity You could have the following interface 28 interface EntityPersistence public save Entity e public update Entity e public delete Entity e I And if you have obtained an instance of that type through a factory or dependency injection or what ever like this class MyServlet extension EntityPersistence ep Factory get typeof EntityPersi
13. Xtend User Guide June 28 2012 Contents l Getting Started 5 6 7 9 A A ees ee ea ee aoe 9 eS a oo Sodas Wee Sk ae fa ee Gs ees GO eee a ae 10 3 3 Answering Some Questions 11 3 3 1 Question 1 What Is The Number Of Action Movies 11 3 3 2 Question 2 What Is The Year The Best Movie From The 80 s i Moe a Res en ee ae Et E NS 12 MOVIES Ws gh ae Ha BOR a REG da 13 Il Reference Documentation 14 4 Java Interoperability 15 cena eh BH hee ete Ge eh Sear a ee Se oe gS ee ee 15 4 2 Conversion Rules 15 ge Be Bettis ge tS an er oe Sts Ge tn ee 16 5 Classes and Members 17 oe a he Ses ge ee eran fe a ee 17 O AP 17 Sn Soa yee NG Becton ee he ee ee eet eS te a 18 DA CONStructOrs 4 sos 48 4 a OR p Slate oe ig a a ee ee Lu nes 19 5 0 Fields a se 08 ge a OR we ee Rha ma 19 5 6 Methods so s aoso ead La ga BERS REE eR da See eS 20 5 6 1 Abstract Methods 20 bee 2 ge A o Gees 20 A ee 21 5 6 4 Inferred Return Types 21 5 6 5 Generic Methods 22 5 6 6 Dispatch Methods 22 Dit AhnOtatiONS ur Hk de dia bare Pa a ee AU eA 26 5 8 Extension Methods 26 5 8 1 Extensions From The Library 27 5 8 2 Local Extension Methods 28 Dee ae ee oe os eee ee
14. a In contrast to 17 Java the terminating semicolon is optional Xtend also features static imports but allows only a wildcard at the end i e you currently cannot import single members using a static import Non static wildcard imports are deprecated for the benefit of better tooling As in Java all classes from the java lang package are implicitly imported import java math BigDecimal import static java util Collections Static methods of helper classes can also be imported as extensions See the section on extension methods 85 8 for details 5 3 Class Declaration The class declaration reuses a lot of Java s syntax but still is a bit different in some aspects Java s default package private visibility does not exist in Xtend As an Xtend class is compiled to a top level Java class and Java does not allow private or protected top level classes any Xtend class is public It is possible to write public explicitly Since version 2 3 multiple class declaration per file are supported Each of these classes is compiled to a separate top level Java class Abstract classes are defined using the abstract modifier as in Java See also tion 5 6 1 on abstract methods Xtend s approach to inheritance is conceptual the same as in Java Single inheritance of classes as well as implementing multiple interfaces is supported Xtend classes can of course extend other Xtend classes and even Java classes can inherit from Xtend classes
15. a method declares parameters The lambda above has one parameter called e which is of type ActionEvent You do not have to specify the type explicitly because it can be inferred from the context textField addActionListener e textField text Something happened D Also as lambdas with one parameter are a common case there is a special short hand for them which is to leave the declaration including the vertical bar out The name of the single variable 6 6 2 will be it in that case textField addActionListener textField text Something happened D A lambda expression with zero arguments is written like this note the bar after the opening bracket val Runnable runnable printin Hello I m executed When a method call s last parameter is a lambda it can be passed right after the parameter list For instance if you want to sort some strings by their length you could write 39 Collections sort someStrings a b a length b length which is just the same as writing Collections sort someStrings a b a length b length D Since you can leave out empty parenthesis for methods which get a lambda as their only argument you can reduce the code above further textField addActionListener textField text Something happened A lambda expression also captures the current scope so that any final variables and parameters visible at construction time can be refe
16. a receiver was null Xtend supports the safe navigation operator to make such code better readable Instead of writing if myRef null myRef doStuff one can write myRef doStuff 6 7 Constructor Call Constructor calls have the same syntax as in Java The only difference is that empty parenthesis are optional new String new String new ArrayList lt BigDecimal gt new ArrayList lt BigDecimal gt 6 8 Lambda Expressions A lambda expression is basically a piece of code which is wrapped in an object to pass it around As a Java developer it is best to think of a lambda expression as an anonymous class i e like in the following Java code Java Code final JTextField textField new JTextField textField addActionListener new ActionListener Override public void actionPerformed ActionEvent e textField setText Something happened H 38 This kind of anonymous classes can be found everywhere in Java code and have always been the poor man s replacement for lambda expressions in Java Xtend not only supports lambda expressions but offers an extremely dense syntax for it That is the code above can be written in Xtend like this val textField new JTextField textField addActionListener ActionEvent e textField text Something happened D As you might have guessed a lambda expression is surrounded by square brackets inspired from Smalltalk Also a lambda expression like
17. annotated as Property the Xtend compiler will generate a Java field a getter and if the field is non final a setter method The name of the Java field will be prefixed with an _ and have the visibility of the Xtend field The accessors methods are always public Thus an Xtend field Property String name will compile to the Java code private String _ name public String getName return this name public void setName final String name this name name 7 2 OData The annotation Data will turn an annotated class into a value object class A class annotated with Data has the following effect e all fields are flagged final e getter methods will be generated if not existent 51 e a constructor taking parameters for all non initialized fields will be generated if not existent e equals Object hashCode methods will be generated if not existent e a toString method will be generated if not existent Example Data class Person String firstName String lastName 52 List of External Links ttp docs oracle com javase specs jls se5 0 html conversions html 5 ttp docs oracle com javase specs jls se5 0 html classes html 8 4 4 PB ttp projecteuler net problem 1 ttp projecteuler net ttp projectlombok org features SneakyThrows html BIS ttp java sun com docs books jls third_edition html j3T0C html ttp docs oracle com javase specs jls se5 0 html conversi
18. can be set using an assignment myObj myField foo Setting Properties The lack of properties in Java leads to a lot of syntactic noise when working with data objects As Xtend is designed to integrate with existing Java APIs it respects the Java Beans convention hence you can call a setter using an assignment 34 myObj myProperty foo calls myObj setMyProperty foo The setter is only used if the field is not accessible from the given context That is why the Property annotation 87 1 would rename the local field to myProperty The return type of an assignment is the type of the right hand side in case it is a simple assignment If it is translated to a setter method it yields whatever the setter method returns 6 4 Blocks The block expression allows to have imperative code sequences It consists of a se quence of expressions and returns the value of the last expression The return type of a block is also the type of the last expression Empty blocks return null are only allowed within blocks and cannot be used as a block s last expression A block expression is surrounded by curly braces and contains at least one expression It can optionally be terminated by a semicolon Here are two examples doSideEffect foo result var X greeting if x equals Hello x World else i 6 5 Variable Declarations Variable declarations are only allowed within blocks 6 4 Th
19. e 4 def print Node n node n name node NodeName The indentation before node n name will be skipped as it is relative to the opening mark of the template string and thereby not considered to be relevant for the output but only for readability of the template itself class Template def print Node n node n name IF hasChildren n children map print ENDIF node Parent node FirstChild node SecondChild node Leaf As in the previous example there is no indentation on the root level for the same reason The first nesting level has only one indentation level in the output This is derived from the indentation of the IF hasChildren condition in the template which is 49 nested in the node The additional nesting of the recursive invocation children map print is not visible in the output as it is relative the the surrounding control structure The line with IF and ENDIF contain only control structures thus they are skipped in the output Note the additional indentation of the node Leaf which happens due to the first rule Indentation is propagated to called templates 50 T Processed Annotations Xtend comes with annotations that help to steer the compilation process These anno tations reside in the org eclipse xtend lib plug in jar which must be on the class path of the project containing the Xtend files 7 1 Property For fields that are
20. e configurable The hello world example is translated to the following Java code Generated Java Source Code import org eclipse xtext xbase lib InputOutput public class HelloWorld public static void main final String args InputOutput lt String gt printin Hello World The only surprising fact in the generated Java code may be the referenced library class InputOutput It is provided by the runtime library and only one nice utility that is handy when using expressions You can put an Xtend class into a source folder of any Java project within Eclipse or any Maven project Eclipse will complain about the missing library if it is not on the class path and provide a quick fix to add it The next thing you might want to do is materializing one of the example projects into your workspace To do so right click anywhere in the Navigator view in Eclipse and select New gt Example In the upcoming dialog you will find two examples for Xtend e Xtend Introductory Examples contains a couple of example code snippets illustrat ing certain aspects and strengths of Xtend It for instance shows how to build an API which allows for writing code like this assertEquals 42 km h 40_000 m 2 km 60 min Also the the movies example 3 explained in detail in the next section 3 is included there e Xtend Solutions For Euler contains solutions to a lot of the problems you will find at Project Euler s website T
21. ee ee 28 5 8 4 Extension Fields 28 6 Expressions 30 6 1 Literals 5 2 ss si be b san s EE eh MAR Re asp fm 30 ode YR REE A eg Se ES See eS 30 6 1 2 Number Literals 31 6 1 3 Boolean Literals 31 GLA Nal Literals s 444 4 444 rr de ee ee Ge ee sens 31 OM De LS he ee ie a Qe De A Ra 31 6 2 Type Casts 32 6 3 Infix Operators and Operator Overloading 32 ad PA a bak Ghee uen 33 be ne bee Boe ah pide a a hte 34 eros gee Ghee ease aaah ee ee ee Sets ee a 34 64 Blocks 4 srann ee mie misa e wR EE pe 35 6 5 Variable Declarations 35 ol Ll ypial s uti ae a RENE e a A 36 E E od are Pa ha Be 36 6 6 1 Property Access 37 6 6 2 Implicit Variables this and it ee eee 37 6 6 3 Static Access 37 6 6 4 Null Safe Feature Call 38 6 7 Constructor Call 38 on ee a E 38 6 81 Typingl E 40 a a o as a A 41 DRA da A A 42 A D ee ee a ae 42 6 11 For Loop 43 6 12 While Loop 43 6 13 Do While Loop 44 RN A Ga es 44 O e e e e 44 6 16 Lry Gatch Finally cias ea eee ee des Pe Ru d a mue e E 45
22. ey are visible in any subsequent expressions in the block 39 A variable declaration starting with the keyword val denotes a value which is essen tially a final i e unsettable variable In some cases one needs to update the value of a reference In such situations the variable needs to be declared with the keyword var which stands for variable A typical example for using var is a counter in a loop val max 100 vari 0 while i lt max printIn Hi therel i it l Shadowing variables from outer scopes is not allowed the only exception is the variable 86 6 2 lit Variables declared outside a lambda expression using the var keyword are not accessible from within a lambda expressions 6 5 1 Typing The type of the variable itself can either be explicitly declared or be inferred from the right hand side expression Here is an example for an explicitly declared type var List lt String gt msg new ArrayList In such cases the type of the right hand expression must conform to the type of the expression on the left side Alternatively the type can be left out and will be inferred from the initialization expression var msg new ArrayList lt String gt gt msg is of type ArrayList lt String gt 6 6 Field Access and Method Invocation A simple name can refer to a local field variable or parameter In addition it can point to a method with zero arguments since empty parenthesis are optional
23. g default It s another short string the main expression numberAsText is evaluated first and then compared to each case sequentially If the case expression is of type boolean the case matches if the expression evaluates to true If it is not of type boolean it is compared to the value from the main expression using Object equals Object If a case is a match that is it evaluates to true or the result equals the one we are switching over the case expression after the colon is evaluated and is the result of the whole expression 6 10 1 Type guards Instead of or in addition to the case guard you can specify a type guard The case only matches if the switch value conforms to this type A case with both a type guard and a predicate only matches if both match If the switch value is a variable this variable is automatically casted to the given type within the predicate and the case s body def length Object x switch x String case x length gt 0 x length length is defined for String List lt gt x size size is defined for List default 1 i Switches with type guards are a safe and much more readable alternative to instance of casting orgies you might know from Java 42 6 11 For Loop The for loop for T1 variable arrayOrlterable expression is used to execute a certain expression for each element of an array or an instance of Iterable The local variable is final hence cannot be updated
24. hese examples are leveraging the whole expressive power of Xtend For instance Euler Problem 1 can be solved with the following expression 1 999 filter i i 3 0 i 5 0 J reduce i1 i2 i1 i2 3 The Movies Example The movies example is included in the example project Xtend Introductory Examples src examples6 Movies xtend and is about reading a file with data about movies and doing some analysis on it 3 1 The Data The movie database is a plain text file data csv with data sets describing movies Here is an example data set Naked Lunch 1991 6 9 16578 Biography Comedy Drama Fantasy The values are separated by two spaces The columns are 1 title 2 year 3 rating 4 numberOfVotes 5 categories Let us define a data type Movie representing a data set Data class Movie String title int year double rating long numberOfVotes Set lt String gt categories It is a plain class with a typed field for each column in the data sets The Data 87 2 annotation will turn this class into a value object that is it will get e a getter method for each field e a hashCode equals implementation e implementation of Object toString e a constructor accepting values for all fields in the declared order 3 2 Parsing The Data Let us now add another class to the same file any number of classes 5 per file is allowed and initialize a field called movies with a list of movies Fo
25. ined in the the Java Language Specification 5 6 6 Dispatch Methods Generally method binding works just like method binding in Java Method calls are bound based on the static types of arguments Sometimes this is not what you want Especially in the context oflextension methods 85 8 you would like to have polymorphic behavior A dispatch method is marked using the keyword dispatch def dispatch printType Number x it s a number def dispatch printType Integer x it s an int For a set of visible dispatch methods in the current type hierarchy sharing the same name and the same number of arguments the compiler infers a synthetic method the dispatcher using the common super type of all declared arguments The actual dispatch methods are reduced in visibility and renamed prepending an underscore so that client code always binds to the dispatcher method For the two dispatch methods in the example above the following Java code would be generated 22 protected String _ print Type final Number x return it s a number protected String _ printType final Integer x return it s an int public String printType final Number x if x instanceof Integer return _ printType Integer x else if x null 4 return _ printType x else throw new lllegalArgumentException Unhandled parameter types Arrays lt Object gt asList x toString I Note that the instanceof ca
26. lt visibility is private You can also declare it explicitly as being public protected or private A specialty of Xtend are fields that provide extension methods which are covered in their own section 85 8 19 5 6 Methods Xtend methods are declared within a class and are translated to a corresponding Java method with exactly the same signature The only exceptions are dispatch methods which are explained later 85 6 6 def String first List lt String gt elements elements get 0 The default visibility of a plain method is public You can explicitly declare it as being public protected or private Xtend supports the static modifier for methods def static createlnstance new MyClass foo As in Java 5 Xtend allows vararg parameters def printAll String strings 4 strings forEach s printin s 5 6 1 Abstract Methods An abstract method in Xtend just does not define a body and must be declared within an abstract class Also specifying the return type is mandatory since it cannot be inferred abstract class MyAbstractClass def String abstractMethod no body 5 6 2 Overriding Methods Methods can override other methods from the super class or implement interface methods using the keyword override If a method overrides a method from a super type the override keyword is mandatory and replaces the keyword def As in Java final methods cannot be overridden by subclasses Example 20 o
27. menting the corresponding method signature As an example the runtime library contains a class BigDecimalExtensions that defines operators for BigDecimals which allows the following code val x 2 71BD val y 3 14BD val sum x y calls BigDecimalExtension operator plus x y This is the complete list of all available operators and their corresponding method signatures 32 el e2 el operator_add e2 el e2 el operator_or e2 el amp amp e2 el operator_and e2 el e2 el operator_equals e2 el e2 el operator_notEquals e2 el lt e2 el operator_lessThan e2 el gt e2 el operator_greaterThan e2 el lt e2 el operator_lessEqualsThan e2 el gt e2 el operator_greaterEqualsThan e2 el gt e2 el operator_mappedTo e2 el e2 el operator_upTo e2 el gt e2 el operator_doubleArrow e2 el lt lt e2 el operator_doubleLessThan e2 el gt gt e2 el operator_doubleGreaterThan e2 el lt lt lt e2 el operator_tripleLessThan e2 el gt gt gt e2 el operator tripleGreaterThan e2 el lt gt e2 el operator_diamond e2 el e2 el operator_elvis e2 el lt gt e2 el operator_spaceship e2 el e2 el operator_plus e2 el e2 el operator_minus e2 el e2 el operator_multiply e2 el e2 el operator_divide e2 el e2 el operator_modulo e2 el e2 el operator_power e2 el el operator_not el el operator_minus The table above also defines the operator precedence in ascending
28. nstanceof Integer return _ printType Integer x else if x null return _ printType x else if x null return _ printType Void null else throw new lllegalArgumentException Unhandled parameter types Arrays lt Object gt asList x toString h Dispatch Methods and Inheritance Any visible Java methods from super types conforming to the compiled form of a dispatch method are also included in the dispatch Conforming means they have the right number of arguments and have the same name starting with an underscore For example consider the following Java class 24 public abstract class AbstractLabelProvider protected String _label Object o some generic implementation and the following Xtend class which extends the Java class class MyLabelProvider extends AbstractLabelProvider def dispatch label Entity it name def dispatch label Method it 4 name params join type def dispatch label Field it name type The resulting dispatch method in the generated Java class MyLabelProvider would then look like this public String label final Object it if it instanceof Entity return _label Entity it else if it instanceof Field return _ label Field it else if it instanceof Method return _ label Method it else if it null return super _label it else throw new lllegalArgumentException Unhandled parameter type
29. numbers 6 1 2 booleans 6 1 3 null and Java types 6 1 5 are supported 6 1 1 String Literals A string literal is of type String just like in Java String literals are enclosed in a pair of single quotes or double quotes We mostly use single quotes because the signal to noise ration is a bit better but generally you should use the terminals which are least likely occur in the actual string Special characters can be quoted with a backslash or defined using Java s unicode notation Contrary to Java strings can span multiple lines Hello World Hello World Hello World l Hello World Hello World 30 6 1 2 Number Literals Xtend supports roughly the same number literals as Java with a few differences First there are no signed number literals If you put a minus operator in front of an number literal it is taken as a with one argument the positive number literal Second as in Java 7 you can separate digits using _ for better readability of large numbers An integer literal creates an int a long suffix L or a BigInteger suffix BI There are no octal numbers 42 1 234 567 890 Oxbeef hexadecimal 077 decimal 77 NOT octal 1 an expression consisting of the unary operator and an integer literal 42L Oxbeef L hexadecimal mind the Oxbeef_ beef beef beef beef Bl Biglnteger A floating point literal creates a double suffix D or none a float suffix F
30. on as a parameter It basically invokes that function for each value in the list and returns another list containing the results of the function invocations Function objects are created using lambda expressions 6 8 the code in squared brackets Within the lambda we process a single line from the text file and turn it into a movie by splitting the string using the separator two whitespace characters and calling iterator on the result As you might know String split String returns a string array String which Xtend auto converts to a list 4 2 when we call Iterable iterator on it val segments line split iterator Now we use the iterator to create an instance of Movie The data type conversion e g String to int is done by calling static methods 66 6 3 from the wrapper types The rest of the iterable is turned into a set using the extension method IteratorExten sions toSet Iterator lt T gt and contains all the categories the movie is associated with return new Movie segments next Integer parselnt segments next Double parseDouble segments next Long parseLong segments next segments toSet 3 3 Answering Some Questions Now that we have turned the text file into a List lt Movie gt we are ready to execute some queries against it We use JUnit to make the individual analysis executable 3 3 1 Question 1 What Is The Number Of Action Movies Test def numberOfActionMovies assertE
31. ons html 53 5
32. order The blank lines separate precedence levels The assignment operator is right to left associative in the same way as the plain assignment operator is That is a b c is executed as a b Cc all other operators are left to right associative Parenthesis can be used to adjust the default precedence and associativity 6 3 1 Short Circuit Boolean Operators If the operators and amp amp are bound to the library methods BooleanExtensions operator_and boolean 1 boolean r resp BooleanExtensions operator_or boolean 1 boolean r the operation is 33 evaluated in short circuit mode That means that the right hand operand might not be evaluated at all in the following cases 1 in the case of the operand on the right hand side is not evaluated if the left operand evaluates to true 2 in the case of amp amp the operand on the right hand side is not evaluated if the left operand evaluates to false Still you can overload these operators for your types or even override it for booleans in which case both operands are always evaluated and the defined method is invoked i e no short circuit execution is happening 6 3 2 Examples my property 23 myList 23 x gt 23 amp amp y lt 23 x amp amp y z 1 3 5 23 I x 6 3 3 Assignments Local variables 86 5 can be reassigned using the operator var greeting Hello if islnformal greeting Hi Of course also non final fields
33. ore details 15 4 3 Interoperability with Java Resembling and supporting every aspect of Java s type system ensures that there is no impedance mismatch between Java and Xtend This means that Xtend and Java are 100 interoperable There are no exceptional cases You do not have to think in two worlds You can call Xtend code from Java and vice versa without any surprises or hassles As a bonus if you know Java s type system specifically generics you already know the most complicated part of Xtend 16 5 Classes and Members At a first glance an Xtend file pretty much looks like a Java file It starts with a package declaration followed by an import section and a class definition The class in fact is directly translated to a Java class in the corresponding Java package A class can have constructors fields and methods Here is an example package com acme import java util List class MyClass String name new String name this name name def String first List lt String gt elements elements get 0 5 1 Package Declaration Package declarations look like in Java There are two small differences e An identifier can be escaped with a character in case it conflicts with a keyword e The terminating semicolon is optional package com acme 5 2 Imports The ordinary imports of type names are equivalent to the imports known from Java Again one can escape any names conflicting with keywords using
34. ovie from the list and return its year We could have sorted descending and take the head of the list as well movies filter 1980 1989 contains year sortBy rating head year 12 Note that first sorting and then taking the last or first is slightly more expensive than needed We could have used the method reduce instead to find the best movie which would be more efficient Maybe you want to try it on your own The calls to movie year as well as movie categories in the previous example in fact access the corresponding getter methods 86 6 1 3 3 3 Question 3 What Is The The Sum Of All Votes Of The Top Two Movies Test def void sumOfVotesOfTop2 val long sum movies sortBy rating take 2 map numberOfVotes reduce a b a b assertEquals 47 229L sum First the movies are sorted by rating then we take the best two Next the list of movies is turned into a list of their numberOfVotes using the map function Now we have a List lt Long gt which can be reduced to a single Integer by adding the values You could also use reduce instead of map and reduce Do you know how 13 Part Il Reference Documentation 4 Java Interoperability Xtend like Java is a statically typed language In fact it completely supports Java s type system including the primitive types as int or boolean arrays and of course all classes interfaces enums and annotations that reside on the class path Java generics are f
35. quals 828 movies filter categories contains Action size 11 First the movies are filtered The lambda expression checks whether the current movie s categories contain the entry Action Note that unlike the lambda we used to turn the lines in the file into movies we have not declared a parameter name this time We could have written movies filter movie movie categories contains Action size but since we left out the name and the vertical bar the variable is automatically named it which like this is an implicit variable 6 6 2 That is why we can write either movies filter it categories contains Action size or movies filter categories contains Action size Eventually we call size on the resulting iterable which also is an extension method defined in IterableExtensions 3 3 2 Question 2 What Is The Year The Best Movie From The 80 s Was Released OTest def void yearOfBestMovieFrom80s assertEquals 1989 movies filter 1980 1989 contains year sortBy rating last year Here we filter for all movies whose year is included in the range from 1980 to 1989 the 80 s The operator is again an extension defined in IntegerExtensions and returns an instance of IntegerRange Operator overloading is explained in section 86 3 The resulting iterable is sorted IterableExtensions sortBy by the rating of the movies Since it is sorted in ascending order we take the last m
36. r the initialization we read in the text file and turn the data sets into Movies import java io FileReader import java util Set import static extension com google common io CharStreams class Movies val movies new FileReader data csv readLines map line val segments line split iterator return new Movie segments next Integer parselnt segments next Double parseDouble segments next Long parseLong segments next segments toSet J A field s type 5 5 can be inferred from the expression on the right hand side That is called local type inference and is supported everywhere in Xtend We want the field to be final so we declare it as a value using the keyword val The initialization on the right hand side first creates a fresh instance of FileReader Then the method readLines is invoked on that instance But if you have a look at FileReader you will not find such a method because readLines is in fact a static method from Google Guava s CharStreams which was imported as an extension 5 8 3 which allows us to use this readable syntax import static extension com google common io CharStreams 10 CharStreams readLines Reader returns a List lt String gt on which we call another ex tension method called map That one is defined in the runtime library ListExten sions map and is always imported and therefore automatically available on all lists The map extension expects a functi
37. rown using the throw technique 5 6 3 Of course you can always catch and handle 6 16 them 6 9 If Expression An if expression is used to choose between two different values based on a predicate An expression if p el else e2 results in either the value el or e2 depending on whether the predicate p evaluates to true or false The else part is optional which is a shorthand for else null That means if foo x is a short hand for if foo x else null The type of an if expression is the common super type of the return types T1 and T2 of the two expression el and e2 While the if expression has the syntax of Java s if statement it behaves more like Java s ternary operator predicate thenPart elsePart because it is an expression and returns a value Consequently you can use if expressions deeply nested within expressions val name if firstName null firstName lastName else lastName Al 6 10 Switch Expression The switch expression is very different from Java s switch statement First there is no fall through which means only one case is evaluated at most Second the use of switch is not limited to certain values but can be used for any object reference instead Object equals Object is used to compare the value in the case with the one you are switching over Given the following example switch myString case myString length gt 5 a long string case some It s some strin
38. rred to That is exactly what we did with the variable textField above 6 8 1 Typing Lambdas are expressions which produce Function objects The type of a lambda expres sion generally depends on the target type as seen in the previous examples That is the lambda expression can coerce to any interface which has declared only one method in addition to the ones inherited from Object This allows for using lambda expressions in many existing Java APIs directly However if you write a lambda expression without having any target type expectation like in the following assignment val toUpperCaseFunction String s s toUpperCase inferred type is String gt String The type will be one of the types found in Functions or Procedures It is a procedure if the return type is void otherwise it is a function Xtend supports a shorthand syntax for function types Instead of writing Function lt super String extends String gt which is what you will find in the generated Java code you can simply write String gt String Example 40 val String gt String stringToStringFunction toUpperCase or val Function1 lt super String extends String gt same toUpperCase or val string ToStringFunction2 String s s toUpperCase inferred type is String gt String Checked exceptions that are thrown in the body of a lambda expression but not declared in the implemented method of the target type are th
39. s Arrays lt Object gt asList it toString 25 Static Dispatch Methods Also static dispatch methods are supported But you cannot mix static and non static dispatch methods 5 7 Annotations The syntax and semantics for annotations is exactly like defined in the Java Language Specification Annotations are available on classes fields methods and parameters Here is an example TypeAnnotation some value class MyClass FieldAnnotation children MyAnno true GMyAnno false String myField MethodAnnotation children MyAnno true MyAnno def String myMethod ParameterAnnotation String param VE Certain annotations defined in the library have a special effect on how the code is translated to Java These annotations are explained in section 87 5 8 Extension Methods Extension methods allow to add new methods to existing types without modifying them This feature is actually where Xtend got its name from They are based on a simple syntactic trick Instead of passing the first argument of an extension method inside the parentheses of a call the method is called on the argument parameter as if it was one of its members hello toFirstUpper calls toFirstUper hello Method calls in extension syntax often result in more readable code as they are chained rather than nested Another benefit of extensions is that you can add methods which are specific to a certain context or layer of
40. scade is ordered such that more specific types come first The default visibility of the underscore methods is protected If all dispatch methods explicitly declare the same visibility this will be the visibility of the inferred dispatcher too Otherwise it is public The comparison of the type parameters goes from left to right That is in the fol lowing example the second method declaration is considered more specific since its first parameter type is the most specific def dispatch printTypes Number x Integer y it s some number and an int def dispatch print Types Integer x Number y it s an int and a number generates the following Java code public String printTypes final Number x final Number y if x instanceof Integer amp amp y null return _ printTypes Integer x y else if x null 23 amp amp y instanceof Integer 4 return _ printTypes x Integer y else 4 throw new lllegalArgumentException Unhandled parameter types Arrays lt Object gt asList x y toString As you can see a null reference is never a match If you want to fetch null you can declare a dispatch case using the type Void def dispatch printType Number x it s some number def dispatch print Type Integer x it s an int def dispatch printType Void x it s null This compiles to the following Java code public String printType final Number x if x i
41. stence You are able to save update and delete any entity like this val Person person person save calls ep save person person name Horst person update calls ep update person person delete calls ep delete person Using the extension modifier on fields has a significant advantage over static extension Your code is not bound to the actual implementation of the extension method You can simply exchange the component that provides the referenced extension with another implementation from outside by providing a different instance No matter whether you do so via a factory a dependency injection container or simply using a setter 29 6 Expressions Xtend does not have statements Instead everything is an expression and has a return value That allows to compose your code in interesting ways For example you can have a try catch expression on the right hand side of an assignment val data try fileContentsToString data txt catch IOException e 4 dummy data If fileContentsToString throws an IOException it is caught and the string dummy data is assigned to the value data Expressions can appear as initializers of fields 5 5 the body of constructors or meth ods and as values in annotations A method body can either be a block expression 86 4 or a template expression 86 17 6 1 Literals A literal denotes a fixed unchangeable value Literals for strings 6 1 1
42. ully supported as well You can define type parameters on methods and classes and pass type arguments to generic types just as you are used to from Java The type system and its conformance and casting rules are implemented as defined in the Java Language Specification 4 1 Type Inference One of the problems with Java is that you are forced to write type signatures over and over again That is why so many people do not like static typing But this is in fact not a problem of static typing but simply a problem with Java Although Xtend is typed just like Java you rarely have to write types down because they can be computed from the context 4 2 Conversion Rules In addition to Java s autoboxing to convert primitives to their corresponding wrapper types e g int is automatically converted to Integer when needed there are additional conversion rules Arrays are automatically converted to List lt ComponentType gt and vice versa That is you can write the following def toList String array val List lt String gt asList array return asList Another very useful conversion applies to lambda expressions A lambda expression usually is of one of the types listed in Functions or Procedures However if the expected type is an interface with a single method declaration a lambda expression is automati cally converted to that type This allows to use lambda expressions with many existing Java libraries See subsection 6 8 1 for m
43. verride String second List lt String gt elements elements get 1 5 6 3 Declared Exceptions Xtend does not force you to catch or redeclare checked exceptions Nevertheless you can still declare the exceptions thrown in a method s body using the same throws clause as in Java If you do not declare checked exceptions in your method but they are possibly thrown in your code the compiler will throw the checked exception silently using the sneaky throw technique introduced by Lombok throws an Exception 7 def void throwException throws Exception throw new Exception throws an Exception without declaring it E def void sneakyThrowException throw new Exception 5 6 4 Inferred Return Types If the return type of a method can be inferred from its body it does not have to be declared That is the method def String second List lt String gt elements elements get 1 could be declared like this 21 def second List lt String gt elements elements get 1 This does not work for abstract method declarations as well as if the return type of a method depends on a recursive call of the same method 5 6 5 Generic Methods You can specify type parameters just like in Java To generalize the method from the previous section you would declare it like this def lt T gt second List lt T gt elements elements get 1 Also bounds and the like are supported and share the same syntax as def
Download Pdf Manuals
Related Search
Related Contents
Samsung MX-E850 manual do usuário Istruzioni d`uso VEGACAP 67 Guía del usuario del Nokia 6086 Sony KV-14FV1U Universal Remote User Manual Copyright © All rights reserved.
Failed to retrieve file