Рубрики
Без рубрики

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

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

Автор оригинала: baeldung.

1. Обзор

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

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

В этом учебнике, мы будем смотреть на то, как преобразовать несколько структур данных Vavr в наши стандартные коллекции Java и наоборот .

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

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

Это полезно, как Значение интерфейс поставляется с большим количеством toJavaXXX () методы которые позволяют преобразовать структуры данных Vavr в эквиваленты Java.

Давайте посмотрим, как Java Список могут быть получены из Список или Поток Вавр:

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 () метод.

Аналогичным образом, мы можем получить другие коллекции Java от объектов Vavr .

Давайте посмотрим еще один пример преобразования Vavr Карта на Java- карта:

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

Помимо стандартных коллекций Java, Vavr также предоставляет API для преобразования значений в Java-потоки и Факультативы .

Давайте посмотрим пример получения Необязательный с помощью в ЯваОптионал () метод:

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

В обзоре методов Vavr этого типа, у нас есть:

  • вДжаваррай ()
  • toJavaCollection()
  • toJavaList()
  • toJavaMap()
  • toJavaSet()
  • в ЯваОптионал ()
  • в ДжаваПараллелСтрим ()
  • в ЯваСтрим ()

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

3. Преобразование Явы в Вавр

Все реализации коллекции в Vavr имеют базовый тип Проходимый. Таким образом, каждый тип коллекции имеет статический метод всех () что занимает Итерируемые и преобразует его в соответствующую коллекцию Vavr .

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

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

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

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

4. Просмотры коллекции Java

Библиотека Vavr также предоставляет Представления коллекции Java, которые делегируют вызовы в базовые коллекции Vavr, .

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

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

Для Список , Есть два метода, которые доступны, чтобы получить наш вид. Во-первых, какДжава () который возвращает непреложный Список и следующий из них asJavaMutable ().

Вот пример, который демонстрирует непреложный Java- Список :

@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());
}

Как Список является неизменным выполнения любой модификации на нем бросает НеподдерживаемаяОперацияЭксцепция .

Мы также можем получить Список ссылаясь на какJavaMutable () метод на список.

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

@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 и наоборот, мы можем преобразовать Значение типа в Vavr к другим Значение Типы. Эта функция преобразования помогает конверсии между объектами Vavr, когда есть необходимость.

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

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

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

Полный список API можно найти здесь .

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

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

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