Java8:在同一流中映射两个属性



我有一个具有以下签名的类Model

class Model {
private String stringA;
private String stringB;
public Model(String stringA, String stringB) {
this.stringA = stringA;
this.stringB = stringB;
}
public String getStringA() {
return stringA;
}
public String getStringB() {
return stringB;
}
}

我想将List<Model>映射到单个流中包含字符串 A 和字符串 B 的List<String>

List<String> strings = models.stream()
.mapFirst(Model::getStringA)
.thenMap(Model::getStringB)
.collect(Collectors.toList());

或:

List<String> strings = models.stream()
.map(Mapping.and(Model::getStringA,Model::getStringB))
.collect(Collectors.toList());

当然,它们都不会编译,但你明白了。

有没有可能?

编辑:

例:

Model ab = new Model("A","B");
Model cd = new Model("C","D");
List<String> stringsFromModels = {"A","B","C","D"};

您可以像这样一个接一个地列出所有值:

List<String> resultSet =
modelList.stream()
.flatMap(e -> Stream.of(e.getStringA(), e.getStringB()))
.collect(Collectors.toList());

传递给flatMap的函数将应用于产生Stream<String>的每个元素。这里需要使用flatMap将所有嵌套Stream<Stream<String>>折叠为Stream<String>,从而使我们能够将元素收集到List<String>中。

>flatMap是你的朋友:

models
.stream()
.flatMap(model -> Stream.of(model.getStringA(),model.getStringB()))
.collect(Collectors.toList());

flatMap采用类型 R 并期望返回新类型 RR 的流(来自列表、集合、数组)。对于每个1模型,您都会得到n个新元素(在本例中为StringAStringB):

{model_1[String_A1,String_B1] , model_2[String_A2,String_B2] , model_3[String_A3,String_B3]}

您所有的n元素 { [String_A1,String_B1], [String_A2,String_B2],[String_A3,String_B3]}

然后展平,将其放入具有结构的新流中

{String_A1,String_B1,String_A2,String_B2,String_A3,String_B3}

字符串类型。 这就是您拥有新流的方式。

您可以使用flatMap例如,当您有许多需要合并为一个元素的集合/流时。有关更简单的解释,请查看此答案

最新更新