Статьи

Пятничные вкусности Java 8: лямбды и XML

В 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-SNAPSHOT
org.jooq:joox:1.2.0
org.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.0
org.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 .

Ссылка: Java 8 Friday Goodies: Lambdas и XML от нашего партнера по JCG Лукаса Эдера в блоге JAVA, SQL и AND JOOQ .