Java 8 分解出重复的Java8表达式

Java 8 分解出重复的Java8表达式,java-8,Java 8,我发现自己在重复同样的java 8表达式: 在一种方法中,我有: List<Message> latestMessages = new ArrayList<>(); ... return latestMessages.stream().map(messageMapper::asMessageDto).collect(toList()); List latestMessages=new ArrayList(); ... 返回latestMessages.stream().

我发现自己在重复同样的java 8表达式:

在一种方法中,我有:

List<Message> latestMessages = new ArrayList<>();
...
return latestMessages.stream().map(messageMapper::asMessageDto).collect(toList());
List latestMessages=new ArrayList();
...
返回latestMessages.stream().map(messageMapper::AsMessageedTo).collect(toList());
在同一类的另一个方法中,我有:

List<Message> messagesBetweenTwoUserAccounts = ...;
return messagesBetweenTwoUserAccounts.stream().map(messageMapper::asMessageDto).collect(toList());
列出两个用户帐户之间的消息=。。。;
返回两个UserAccounts.stream().map(messageMapper::AsMessageedTo).collect(toList())之间的消息;
两种方法的返回类型都是:
List

我基本上是从
列表
转换为
列表

请注意重复的表达式:

stream().map(messageMapper::asmessageedto).collect(toList())


使用java 8构造分解上述表达式的最佳方法是什么?

如果您不想重复
latestMessages.stream().map(messageMapper::AsMessageedTo).collect(toList())多次,编写一个包含它的方法:

public static List<MessageDto> transformMessages (List<Message> messages) {
    return messages.stream().map(messageMapper::asMessageDto).collect(toList());
}
公共静态列表消息(列表消息){
返回messages.stream().map(messageMapper::asmessageedto.collect(toList());
}
现在,您可以从多个位置调用它,而无需重复该流管道代码


我不知道这个方法是否应该是静态的。这取决于调用它的来源,以及
messageMapper
的来源(正如霍尔格所评论的)。如果方法的不同调用需要不同的映射器,则可以添加
messageMapper
作为参数。

它是如何特定于Java 8的?您可以编写一个方法来获取
列表
,并返回
列表
。方法主体包含Java 8构造这一事实没有什么区别。我原以为会有另一个Java 8构造用于映射和收集,但我可能错了……我可能不会这么做,但从技术上讲,您可以创建一个
函数f=l->l.stream().map(messageMaper::asMessageDto).collect(toList())
并将其用作
返回f.apply(lastestMessages)你应该集中精力。您想知道如何将公共代码提取到方法中,或者是否有替代流API使用的方法?以“什么是最好的方式……”开头的问题通常会得到负面的回应。好吧,问题归结到“是否有替代方案…”也被认为是离题的。没有好处(这就是为什么我说我不会这么做),只是给出了另一种“技术”方法。嗯,这取决于
messageMapper
的来源……messageMapper是类上的一个实例字段。我只在同一个类中使用
messageMapper