Java8:流映射同一流中的两个属性
我有一个带有以下签名的classJava8:流映射同一流中的两个属性,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个带有以下签名的class模型: class Model { private String stringA; private String stringB; public Model(String stringA, String stringB) { this.stringA = stringA; this.stringB = stringB; } publi
模型
:
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;
}
}
我想将一个列表
映射到一个列表
,该列表在一个流中同时包含stringA和stringB
List<String> strings = models.stream()
.mapFirst(Model::getStringA)
.thenMap(Model::getStringB)
.collect(Collectors.toList());
List strings=models.stream()
.mapFirst(模型::getStringA)
.thenMap(模型::getStringB)
.collect(Collectors.toList());
或:
List 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"};
ab型=新型号(“A”、“B”);
型号cd=新型号(“C”、“D”);
列出stringsFromModels={“A”、“B”、“C”、“D”};
您可以一个接一个地列出所有值,如下所示:
List<String> resultSet =
modelList.stream()
.flatMap(e -> Stream.of(e.getStringA(), e.getStringB()))
.collect(Collectors.toList());
列表结果集=
modelList.stream()
.flatMap(e->Stream.of(e.getStringA(),e.getStringB())
.collect(Collectors.toList());
传递给
flatMap
的函数将应用于产生流的每个元素。这里需要使用flatMap
将所有嵌套的流
折叠为流
,从而使我们能够将元素收集到列表中
flatMap
是您的朋友吗:
models
.stream()
.flatMap(model -> Stream.of(model.getStringA(),model.getStringB()))
.collect(Collectors.toList());
flatMap
接受类型R,并期望返回新类型RR的流(来自列表、集合、数组)。对于每个1
模型,您将获得n
新元素(在本例中为StringA
和StringB
):
所有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
,例如,当您有多个元素集合/流需要合并为一个元素时。要获得更简单的解释,请勾选此当您说“StringA和StringB都是”时,您是指串联吗?或者您的列表中是否应该包含模型的字符串A
索引0
,然后是模型的字符串b
索引0
,然后是[…]索引1
等等?流通常不喜欢增加大小,这不是它通常的行为方式,你可以通过使用flatMap
来实现你想要的,但那会很难看。有什么原因不想对
循环使用传统的吗?@Mena我是说第二种方法,所以列表字符串
应该包含模型中的每个字符串,包括stringA和stringB。我将提供一个例子。@luk2302这是实际的解决方案,但我想知道我是否可以在Stream中解决它,然后答案是“是的,但它既不美观,也不会有更好的性能”@Sunflame欢迎您。如果有助于澄清答案的话,我还添加了一些额外的解释:)。谢谢,现在如何使用flatMap
,我想它用于将Collection
s或Iterable
s合并到一个流中。这真的很有帮助。
models
.stream()
.flatMap(model -> Stream.of(model.getStringA(),model.getStringB()))
.collect(Collectors.toList());
{model_1[String_A1,String_B1] , model_2[String_A2,String_B2] , model_3[String_A3,String_B3]}