尝试使用 Java Vavr 将 Try<List<Message>> 转换为 Try<List<SummarizedMessage>>
Trying to convert a Try<List<Message>> to a Try<List<SummarizedMessage>> using Java Vavr
我可以使用以下(又丑又臭)代码“解决”这个问题:
List<Message> messages = messagesRepository.findAll().get();
return Try.success(
messages
.stream()
.map(m -> new SummarizedMessage(m.destination(), m.title(), m.date()))
.toList()
);
但是我怎样才能避免这种情况 get()
和 Try.success()
?
您可以使用 map
和 orElse
。
messagesRepository.findAll().map(messages -> messages.stream()
.map(m -> new SummarizedMessage(m.destination(), m.title(), m.date()))
.toList()).orElse(null);
如果这是一个 Spring-based 项目,您可以使用 vavr 的 collections 而不是 java。也就是说,MessageRepository.findAll
可以 return 类型为 io.vavr.collection.List
的列表。所以它可能如下所示:
import io.vavr.collection.List;
import io.vavr.control.Try;
import java.time.Instant;
class Main {
public static void main(String[] args) {
var repo = new MessageRepository();
var summarized = repo
.findAll()
.mapTry(
messages -> messages.map(message -> new SummarizedMessage(message.title(), message.destination(), message.date()))
)
.getOrElse(List.empty());
System.out.println(summarized);
}
}
record Message(String title, String origin, String destination, String text, Instant date) {
}
record SummarizedMessage(String title, String destination, Instant date) {
}
class MessageRepository {
Try<List<Message>> findAll() {
return Try.of(() -> List.of(
new Message("title", "origin", "dest", "text", Instant.now())
));
}
}
它允许您挂断不必要的 .stream()
电话。另外,最好 return 一个空列表(List.empty
of List.of
)而不是 null
,但这可能取决于您的逻辑。
我可以使用以下(又丑又臭)代码“解决”这个问题:
List<Message> messages = messagesRepository.findAll().get();
return Try.success(
messages
.stream()
.map(m -> new SummarizedMessage(m.destination(), m.title(), m.date()))
.toList()
);
但是我怎样才能避免这种情况 get()
和 Try.success()
?
您可以使用 map
和 orElse
。
messagesRepository.findAll().map(messages -> messages.stream()
.map(m -> new SummarizedMessage(m.destination(), m.title(), m.date()))
.toList()).orElse(null);
如果这是一个 Spring-based 项目,您可以使用 vavr 的 collections 而不是 java。也就是说,MessageRepository.findAll
可以 return 类型为 io.vavr.collection.List
的列表。所以它可能如下所示:
import io.vavr.collection.List;
import io.vavr.control.Try;
import java.time.Instant;
class Main {
public static void main(String[] args) {
var repo = new MessageRepository();
var summarized = repo
.findAll()
.mapTry(
messages -> messages.map(message -> new SummarizedMessage(message.title(), message.destination(), message.date()))
)
.getOrElse(List.empty());
System.out.println(summarized);
}
}
record Message(String title, String origin, String destination, String text, Instant date) {
}
record SummarizedMessage(String title, String destination, Instant date) {
}
class MessageRepository {
Try<List<Message>> findAll() {
return Try.of(() -> List.of(
new Message("title", "origin", "dest", "text", Instant.now())
));
}
}
它允许您挂断不必要的 .stream()
电话。另外,最好 return 一个空列表(List.empty
of List.of
)而不是 null
,但这可能取决于您的逻辑。