尝试转换一个Try<;列表<;信息>&燃气轮机;尝试一下<;列表<;摘要消息>&燃气轮机;使用Java Vavr

尝试转换一个Try<;列表<;信息>&燃气轮机;尝试一下<;列表<;摘要消息>&燃气轮机;使用Java Vavr,java,vavr,Java,Vavr,我可以用以下(丑陋和难闻的)代码“解决”这个问题: List messages=messagesRepository.findAll().get(); 回击成功( 信息 .stream() .map(m->新摘要消息(m.destination()、m.title()、m.date()) 托利斯先生() ); 但是我如何才能避免这种get()和Try.success()?您可以使用map和orElse messagesRepository.findAll().map(messages ->

我可以用以下(丑陋和难闻的)代码“解决”这个问题:

List messages=messagesRepository.findAll().get();
回击成功(
信息
.stream()
.map(m->新摘要消息(m.destination()、m.title()、m.date())
托利斯先生()
);

但是我如何才能避免这种
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的项目,您可以使用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())
        ));
    }
}
导入io.vavr.collection.List;
导入io.vavr.control.Try;
导入java.time.Instant;
班长{
公共静态void main(字符串[]args){
var repo=new MessageRepository();
风险价值=回购
.findAll()
马普特里先生(
messages->messages.map(message->new summaredMessage(message.title()、message.destination()、message.date())
)
.getOrElse(List.empty());
系统输出打印项次(汇总);
}
}
记录消息(字符串标题、字符串原点、字符串目标、字符串文本、即时日期){
}
记录摘要消息(字符串标题、字符串目标、即时日期){
}
类消息存储库{
试试findAll(){
返回Try.of(()->List.of(
新消息(“标题”、“来源”、“目的地”、“文本”、即时.now())
));
}
}

它允许您删除不必要的
.stream()
调用。另外,与其使用
null
,不如返回一个空列表(
list.empty
of
list.of
),但这可能取决于您的逻辑。

非常感谢!成功了。@MarcioDavid很乐意帮忙。@MarcioDavid,接受正确的答案。
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())
        ));
    }
}