尝试转换一个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
oflist.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())
));
}
}