Совместимость между Java и Vavr

Совместимость между Java и Vavr

1. обзор

Поскольку Vavr в основном работает в экосистеме Java, всегда необходимо преобразовывать структуры данных Vavr в структуры данных, понятные для Java.

Например, рассмотрим функцию, которая возвращаетio.vavr.collection.List, и нам нужно передать результат другой функции, которая принимаетjava.util.List.. Вот где совместимость Java-Vavr пригодится.

В этом руководстве мы рассмотрим, как использоватьconvert several Vavr data structures into our standard Java collections and vice versa.

2. Преобразование Vavr в Java

ИнтерфейсValue в Vavr является базовым интерфейсом для большинства инструментов Vavr. Таким образом, все коллекции Vavr наследуют свойстваValue.

Это полезно какthe Value interface comes with a lot of toJavaXXX() methods, которое позволяет нам преобразовывать структуры данных Vavr в эквиваленты Java.

Давайте посмотрим, как JavaList может быть получен изList илиStream Vavr:

List vavrStringList = List.of("JAVA", "Javascript", "Scala");
java.util.List javaStringList = vavrStringList.toJavaList();
Stream vavrStream = Stream.of("JAVA", "Javascript", "Scala");
java.util.List javaStringList = vavrStream.toJavaList();

Первый пример преобразует список Vavr в список Java, а следующий преобразует поток в список Java. В обоих примерах используется методtoJavaList().

Аналогичноwe can obtain other Java collections from Vavr objects.

Давайте посмотрим на другой пример преобразования VavrMap в JavaMap:

Map vavrMap = HashMap.of("1", "a", "2", "b", "3", "c");
java.util.Map javaMap = vavrMap.toJavaMap();

Помимо стандартных коллекций Java,Vavr also provides APIs for converting values to Java streams and*Optionals*.

Давайте посмотрим на пример полученияOptional с использованием методаtoJavaOptional():

List vavrList = List.of("Java");
Optional optional = vavrList.toJavaOptional();
assertEquals("Java", optional.get());

В качестве обзора методов Vavr этого типа мы имеем:

  • toJavaArray ()

  • toJavaCollection ()

  • toJavaList ()

  • toJavaMap ()

  • toJavaSet ()

  • toJavaOptional ()

  • toJavaParallelStream ()

  • toJavaStream ()

Полный список полезных API можно найти вhere.

3. Преобразование Java в Vavr

Все реализации коллекций в Vavr имеют базовый типTraversable.  Таким образом,each collection type features a static method ofAll() that takes an Iterable and converts it to the corresponding Vavr collection.

Давайте посмотрим, как мы можем преобразоватьjava.util.List to в VavrList:

java.util.List javaList = Arrays.asList("Java", "Haskell", "Scala");
List vavrList = List.ofAll(javaList);

Точно так же мы можем использовать методofAll() для преобразования потоков Java в коллекции Vavr:

java.util.stream.Stream javaStream
  = Arrays.asList("Java", "Haskell", "Scala").stream();
Stream vavrStream = Stream.ofAll(javaStream);

4. Представления коллекции Java

Библиотека Vavr также предоставляетJava collection views which delegate calls to the underlying Vavr collections.

Методы преобразования Vavr в Java создают новый экземпляр путем перебора всех элементов для создания коллекции Java. Это означает, что производительность преобразования является линейной, тогда как производительность создания представлений коллекции является постоянной.

На момент написания этой статьи в Vavr поддерживается только представлениеList.

ДляList доступны два метода получения нашего представления. СначалаasJava() w, который возвращает неизменяемыйList and, следующий -asJavaMutable().

Вот пример, демонстрирующий неизменный JavaList:

@Test(expected = UnsupportedOperationException.class)
public void givenParams_whenVavrListConverted_thenException() {
    java.util.List javaList
      = List.of("Java", "Haskell", "Scala").asJava();

    javaList.add("Python");
    assertEquals(4, javaList.size());
}

ПосколькуList является неизменным, при выполнении любых модификаций на нем выдаетсяUnsupportedOperationException.

Мы также можем получить изменяемыйList, вызвав методasJavaMutable()  наList.

Вот как мы это делаем:

@Test
public void givenParams_whenVavrListConvertedToMutable_thenRetunMutableList() {
    java.util.List javaList = List.of("Java", "Haskell", "Scala")
      .asJavaMutable();
    javaList.add("Python");

    assertEquals(4, javaList.size());
}

5. Преобразование между объектами Vavr

Подобно преобразованию между Java в Vavr и наоборот, мы можем преобразовать типValue в Vavr в другие типыValue. Эта функция преобразования помогает преобразовывать объекты Vavr, когда это необходимо.

Например, у нас естьList элементов, и мы хотим отфильтровать дубликаты, сохраняя порядок. В этом случае нам понадобитсяLinkedHashSet. Вот пример, демонстрирующий вариант использования:

List vavrList = List.of("Java", "Haskell", "Scala", "Java");
Set linkedSet = vavrList.toLinkedSet();
assertEquals(3, linkedSet.size());
assertTrue(linkedSet instanceof LinkedHashSet);

В интерфейсе Value доступно много других методов, которые помогают нам преобразовывать коллекции в различные типы в зависимости от вариантов использования.

Полный список API можно найтиhere.

6. Заключение

В этой статье мы узнали о преобразовании типов коллекций Vavr и Java. Чтобы узнать больше API-интерфейсов, предоставляемых платформой для преобразования в соответствии с вариантом использования, обратитесь кJavaDoc иuser guide.

Полный исходный код для всех примеров в этой статье можно найти наover on Github.