В Data Geekery мы любим Java. И так как мы действительно входим в свободный API jOOQ и запросы DSL , мы абсолютно взволнованы тем, что Java 8 принесет в нашу экосистему. Мы пару раз писали о приятных вкусностях Java 8 , и теперь мы чувствуем, что пришло время начать новую серию блогов,…
Ява 8 Пятница
Каждую пятницу мы показываем вам пару замечательных новых функций Java 8 в виде учебника, в которых используются лямбда-выражения, методы расширения и другие замечательные вещи. Вы найдете исходный код на GitHub .
Java 8 Goodie: лямбды и XML
Java 8 мало что может сделать с существующими API SAX и DOM. SAX ContentHandler имеет слишком много абстрактных методов, чтобы их можно было квалифицировать как @FunctionalInterface , а DOM — это огромный подробный API, заданный w3c , с небольшим шансом добавления новых методов расширения.
К счастью, есть небольшая библиотека с открытым исходным кодом под названием jOOX, которая позволяет обрабатывать стандартный DOM API w3c через API-оболочку, имитирующую популярную библиотеку jQuery . jQuery использует языковые функции JavaScript, позволяя пользователям передавать функции в API для обхода DOM. То же самое в случае с JOOX. Давайте ближе посмотрим:
Предположим, что мы используем следующий pom.xml
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<?xml version="1.0" encoding="UTF-8"?> <modelVersion>4.0.0</modelVersion> <groupId>org.jooq</groupId> <artifactId>java8-goodies</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.jooq</groupId> <artifactId>joox</artifactId> <version>1.2.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <fork>true</fork> <maxmem>512m</maxmem> <meminitial>256m</meminitial> <encoding>UTF-8</encoding> <source>1.8</source> <target>1.8</target> <debug>true</debug> <debuglevel>lines,vars,source</debuglevel> </configuration> </plugin> </plugins> </build></project> |
Давайте предположим, что мы хотели знать все задействованные артефакты в groupId:artifactId:version записи Maven groupId:artifactId:version . Вот как мы можем сделать это с помощью jOOX и лямбда-выражений:
|
1
2
3
4
5
6
7
8
|
$(new File("./pom.xml")).find("groupId") .each(ctx -> { System.out.println( $(ctx).text() + ":" + $(ctx).siblings("artifactId").text() + ":" + $(ctx).siblings("version").text() );}); |
Выполнение вышеупомянутых выходов:
|
1
2
3
|
org.jooq:java8-goodies:1.0-SNAPSHOTorg.jooq:joox:1.2.0org.apache.maven.plugins:maven-compiler-plugin:2.3.2 |
Давайте предположим, что мы хотели отобразить только те артефакты, которые не имеют SNAPSHOT в своих номерах версий. Просто добавьте фильтр:
|
01
02
03
04
05
06
07
08
09
10
11
|
$(new File("./pom.xml")) .find("groupId") .filter(ctx -> $(ctx).siblings("version") .matchText(".*-SNAPSHOT") .isEmpty()) .each(ctx -> { System.out.println( $(ctx).text() + ":" + $(ctx).siblings("artifactId").text() + ":" + $(ctx).siblings("version").text()); }); |
Это теперь даст
|
1
2
|
org.jooq:joox:1.2.0org.apache.maven.plugins:maven-compiler-plugin:2.3.2 |
Мы также можем трансформировать контент XML. Например, если целевой документ не должен быть POM, мы могли бы заменить соответствующие элементы groupId на элемент искусственного artifact который содержит имя артефакта в нотации Maven. Вот как это сделать:
|
01
02
03
04
05
06
07
08
09
10
11
12
|
$(new File("./pom.xml")) .find("groupId") .filter(ctx -> $(ctx).siblings("version") .matchText(".*-SNAPSHOT") .isEmpty()) .content(ctx -> $(ctx).text() + ":" + $(ctx).siblings("artifactId").text() + ":" + $(ctx).siblings("version").text() ) .rename("artifact") .each(ctx -> System.out.println(ctx)); |
Вышеприведенное помещает новое содержимое вместо предыдущего с помощью .content() , а затем переименовывает элементы groupId в artifact перед печатью элемента. Результат:
|
1
2
|
<artifact>org.jooq:joox:1.2.0</artifact><artifact>org.apache.maven.plugins:maven-compiler-plugin:2.3.2</artifact> |
Больше вкусностей на следующей неделе
То, что сразу становится очевидным, — это то, что выбор группы экспертов по лямбде, делающий все SAM (интерфейсы с одним абстрактным методом) приемлемыми для использования с лямбда-выражениями, добавляет большую ценность уже существующим API. Довольно умный ход.
Но есть и новые API. На прошлой неделе мы обсудили, как можно улучшить существующий файловый API JDK 1.2 с помощью лямбд . Некоторые из наших читателей выразили обеспокоенность тем, что API java.io был в значительной степени заменен на java.nio (nio как в New I / O). На следующей неделе мы java.nnio API Java 8 java.nnio (для новых новых java.nnio ввода-вывода!) И его связь с API потоков Java 8 .