5. Xtend
• Язык общего назначения
• Транслируется в Java 5
• ООП + немного ФП
• Простота изучения (намного проще
Scala), схожесть с Java
6. Xtend
• Язык общего назначения
• Транслируется в Java 5
• ООП + немного ФП
• Простота изучения (намного проще
Scala), схожесть с Java
• Библиотека – тонкая прослойка над
Java (≈100 классов) + Guava
15. No ; and ()
class Main {
def static void main(String[] args) {
println(5.toString)
}
}
16. Translation to Java
import org.eclipse.xtext.xbase.lib.InputOutput;
@SuppressWarnings("all")
public class Main {
public static void main(final String[] args) {
String _string = Integer.valueOf(5).toString();
InputOutput.<String>println(_string);
}
}
17. val, var and type inference
val n = 5
for (i : 1..n) {
var str = i.toString
println(str)
str = ...
}
18. val, var and type inference
val int n = 5
for (int i : 1..n) {
var String str = i.toString
println(str)
str = ...
}
19. Type inference
val list = new ArrayList
list.add(1)
list.add("text")
list.add(true)
println(list)
20. Type inference
val list = new ArrayList
list.add(1)
list.add("text")
list.add(true)
println(list)
Какой тип у ArrayList?
21. Type inference
val list = new ArrayList<Serializable>
list.add(1)
list.add("text")
list.add(true)
println(list)
22. Type inference
val list = new ArrayList<Comparable<?>>
list.add(1)
list.add("text")
list.add(true)
println(list)
23. Everything is an expression
def static readData() {
val data = try {
fileContentsToString('data.txt')
} catch (IOException e) {
"dummy data"
}
println(data)
data
}
24. switch
def String describe(Object x) {
switch x {
Integer case x > 0 : "Positive integer"
String : "String"
List<?> case x.empty : "Empty list"
List<?> : "Non-empty list"
default : x.class.simpleName
}
}
25. Классы
@Data
class Person {
val String firstName
val String lastName
val int age
def void sayHello() {
println('''Hello, my name is «firstName» «lastName»''')
}
}
26. Классы
@Data
@SuppressWarnings("all")
public class Person {
private final String _firstName;
public String getFirstName() {
this._firstName;
}
private final String _lastName;
public String getLastName() {
return this._lastName;
}
private final int _age;
public int getAge() {
return this._age;
}
public void sayHello() { ... }
public Person(final String firstName, final String lastName, final int age) { ... }
@Override
public int hashCode() { ... }
@Override
public boolean equals(final Object obj) { ... }
@Override
public String toString() { ... }
}
27. Классы
class Task implements Runnable {
@Property val String name
@Property var int timeout
new(String name, int timeout) {
this._name = name
this._timeout = timeout
}
new(String name) {
this(name, 600)
}
override run() {
println('''Running task "«name»"''')
...
}
}
28. Операторы
Xtend Java
a == b Objects.equals(a, b)
a === b a == b
a -> b Pair.of(a, b)
a ** b Math.pow(a, b)
a .. b new IntegerRange(a, b)
a ..< b new ExclusiveRange(a, b, true)
a >.. b new ExclusiveRange(a, b, false)
a ?: b if (a != null) a else b
a?.doStuff if (a != null) a.doStuff()
37. Lambdas
val Comparator<String> c =
[a,b | Integer::compare(a.length, b.length)]
final Comparator<String> _function = new Comparator<String>() {
public int compare(final String a, final String b) {
int _length = a.length();
int _length_1 = b.length();
int _compare = Integer.compare(_length, _length_1);
return _compare;
}
};
final Comparator<String> c = _function;
38. Lambdas
val persons = #[
new Person("John", "Doe"),
new Person("Jane", "Roe"),
new Person("David", "McFly")
]
val names = persons.map([p | p.firstName])
// John, Jane, David
39. Lambdas
val persons = #[
new Person("John", "Doe"),
new Person("Jane", "Roe"),
new Person("David", "McFly")
]
val names = persons.map([it.firstName])
// John, Jane, David
40. Lambdas
val persons = #[
new Person("John", "Doe"),
new Person("Jane", "Roe"),
new Person("David", "McFly")
]
val names = persons.map([firstName])
// John, Jane, David
41. Lambdas
val persons = #[
new Person("John", "Doe"),
new Person("Jane", "Roe"),
new Person("David", "McFly")
]
val names = persons.map[firstName]
// John, Jane, David
42. Lambdas
val persons = #[
new Person("John", "Doe", true),
new Person("Jane", "Roe", false),
new Person("David", "McFly", true)
]
val women = persons.filter[female]
// Jane Roe
47. Решение #2
import static extension java.util.Collections.*
val person = persons.max[ p1, p2 |
p1.lastName.length - p2.lastName.length
]
48. Решение #3
val person = persons.reduce[ pWithLongestLastName, p |
if (pWithLongestLastName.lastName.length > p.lastName.length)
pWithLongestLastName
else
p
]
57. Template expressions
val name = "James"
println('''Hello «name»!''')
final String name = "James";
StringConcatenation _builder = new StringConcatenation();
_builder.append("Hello ");
_builder.append(name, "");
_builder.append("!");
InputOutput.<String>println(_builder.toString());
65. Заключение
• Xtend – довольно сырой язык
– Есть баги
– Проблемы с производительностью
– Очень маленькое сообщество
66. Заключение
• Xtend – довольно сырой язык
– Есть баги
– Проблемы с производительностью
– Очень маленькое сообщество
• Неплохая поддержка IDE
67. Заключение
• Xtend – довольно сырой язык
– Есть баги
– Проблемы с производительностью
– Очень маленькое сообщество
• Неплохая поддержка IDE
• Язык не является убийцей Java, он является
убийцей её синтаксиса