#java #maven #intellij-idea #vavr
#java #мавен #intellij-идея #вавр
Вопрос:
Я пытаюсь воспроизвести простой пример декомпозиции объекта отсюда. Я добавил в свой проект следующие зависимости:
<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr</artifactId>
<version>${vavr.version}</version>
</dependency>
<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr-match</artifactId>
<version>${vavr.version}</version>
</dependency>
<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr-match-processor</artifactId>
<version>${vavr.version}</version>
</dependency>
…где vavr.version
находится 0.10.3
и скопировал пример из приведенного выше источника:
import io.vavr.Tuple;
import io.vavr.Tuple2;
import io.vavr.match.annotation.Patterns;
import io.vavr.match.annotation.Unapply;
import lombok.AllArgsConstructor;
import lombok.Getter;
import static io.vavr.API.$;
import static io.vavr.API.Match;
import static io.vavr.API.Match.*;
public class Example {
@Getter
@AllArgsConstructor
public static class Employee {
private String name;
private String id;
}
@Patterns
public static class Demo {
@Unapply
static Tuple2<String, String> Employee(Employee Employee) {
return Tuple.of(Employee.getName(), Employee.getId());
}
}
public static void main(String[] args) {
Employee person = new Employee("Carl", "89696D8");
String result = Match(person).of(
Case(Demo.Employee($("Carl"), $()), (name, id) -> ""),
Case($(), () -> "notfound")
);
}
}
Однако первый Case
выдает ошибку компиляции Expected 1 argument but found 2
, которая наводит меня на мысль, что обработка аннотаций не сработала и соответствующий шаблон не был сгенерирован. Поправьте меня, если я ошибаюсь.
Я работаю с Intellij 2020.1, и в нем включена обработка аннотаций
Комментарии:
1. Не могли бы вы поделиться примером проекта с зависимостями, где для вас воспроизводится случай. Похоже, есть некоторые проблемы с версией зависимостей 0.10.3. Для меня только 0.9.2 включает класс Tuple.
Ответ №1:
Причина в том, что вы использовали недопустимое имя сгенерированного класса в этой строке:
Case(Demo.Employee($("Carl"), $()), (name, id) -> "")
Его следует заменить на:
Case(Example_DemoPatterns.$Employee($("Carl"), $()), (name, id) -> name " " id)
поскольку Demo
это статический вложенный класс, к нему должен быть приставка, Example_
и поскольку именно так работает генератор, он должен иметь суффикс Patterns
.
Вот полный, доступный для сборки пример, который вы можете клонировать и опробовать. Он содержит примеры как для maven, так и для gradle. Чтобы проверить, как это работает, измените указанную строку, например:
Case(Example_DemoPatternsWhatever.$Employee($("Carl"), $()), (name, id) -> name " " id)
а затем запустите:
mvn exec:java
Он завершается с ошибкой (такой класс не генерируется), но при запуске tree target/
вы получите что-то вроде:
target
├── classes
├── generated-sources
│ └── annotations
│ └── Example_DemoPatterns.java
└── maven-status
└── maven-compiler-plugin
└── compile
└── default-compile
├── createdFiles.lst
└── inputFiles.lst
это означает, что класс действительно был сгенерирован. Это класс, который вам нужно использовать.