Sun*_*ame 10 java java-8 java-stream
我有一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
我想将a映射List<Model>到List<String>包含stringA和stringB的单个流中
List<String> strings = models.stream()
.mapFirst(Model::getStringA)
.thenMap(Model::getStringB)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
要么:
List<String> strings = models.stream()
.map(Mapping.and(Model::getStringA,Model::getStringB))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
当然,他们都没有编译,但你明白了.
它有可能吗?
编辑:
例:
Model ab = new Model("A","B");
Model cd = new Model("C","D");
List<String> stringsFromModels = {"A","B","C","D"};
Run Code Online (Sandbox Code Playgroud)
Ous*_* D. 17
您可以一个接一个地列出所有值,如下所示:
List<String> resultSet =
modelList.stream()
.flatMap(e -> Stream.of(e.getStringA(), e.getStringB()))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
传递给的函数flatMap将应用于每个元素,产生一个 Stream<String>.flatMap这里必须使用将所有嵌套的东西折叠Stream<Stream<String>>成a Stream<String>,从而使我们能够将元素收集到一个List<String>.
flatMap 是您的朋友在这里:
models
.stream()
.flatMap(model -> Stream.of(model.getStringA(),model.getStringB()))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
flatMap接受类型R,并期望返回新的类型RR的流(来自列表,集合,数组)。对于每个1模型,您都会获得n新的元素(在本例中是StringA和StringB):
{model_1[String_A1,String_B1] , model_2[String_A2,String_B2] , model_3[String_A3,String_B3]}
Run Code Online (Sandbox Code Playgroud)
您所有的n元素
{ [String_A1,String_B1], [String_A2,String_B2],[String_A3,String_B3]}
然后将其展平并放入具有结构的新Stream中
{String_A1,String_B1,String_A2,String_B2,String_A3,String_B3}
类型为String。这就是您拥有新Stream的方式。
flatMap例如,当您有许多元素的集合/流仅需要合并为一个时,可以使用。有关更简单的说明,请查看此答案