微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试使用 Java Vavr 将 Try<List<Message>> 转换为 Try<List<SummarizedMessage>>

如何解决尝试使用 Java Vavr 将 Try<List<Message>> 转换为 Try<List<SummarizedMessage>>

我可以使用以下(又丑又臭的)代码解决”这个问题:

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()

解决方法

您可以使用 maporElse

messagesRepository.findAll().map(messages -> messages.stream()
                     .map(m -> new SummarizedMessage(m.destination(),m.title(),m.date()))
                     .toList()).orElse(null);
,

如果这是一个基于 Spring 的项目,您可以使用 vavr 的集合而不是 java 的集合。也就是说,MessageRepository.findAll 可以返回类型为 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,Instant date) {
}

class MessageRepository {

    Try<List<Message>> findAll() {
        return Try.of(() -> List.of(
            new Message("title","origin","dest","text",Instant.now())
        ));
    }
}

它允许您放弃不必要的 .stream() 调用。此外,最好返回一个空列表(null of List.empty)而不是 List.of,但这可能取决于您的逻辑。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。