【问题标题】:Trying to convert a Try<List<Message>> to a Try<List<SummarizedMessage>> using Java Vavr尝试使用 Java Vavr 将 Try<List<Message>> 转换为 Try<List<SummarizedMessage>>
【发布时间】:2021-05-13 13:33:09
【问题描述】:

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

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

【问题讨论】:

    标签: java vavr


    【解决方案1】:

    您可以使用maporElse

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

    【讨论】:

    • @MarcioDavid 很高兴为您提供帮助。
    • @MarcioDavid,接受正确答案。
    【解决方案2】:

    如果这是一个基于 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, String destination, Instant date) {
    }
    
    class MessageRepository {
    
        Try<List<Message>> findAll() {
            return Try.of(() -> List.of(
                new Message("title", "origin", "dest", "text", Instant.now())
            ));
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-13
      • 2018-11-07
      • 2021-09-17
      • 2020-02-17
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多