我有一个类A
,有多个列表
成员。
class A {
List<X> xList;
List<Y> yList;
List<Z> zList;
// getters and setters
}
class X {
String desc;
String xtype;
// getters and setters
}
class Y {
String name;
String ytype;
//getters and setters
}
class Z {
String description;
String ztype;
// getters and setters
}
还有一个类B
,只有两个属性:
class B {
String name;
String type;
}
我需要遍历类A
中的各种列表,并创建类B
对象,并添加到这样的列表中:
public void convertList(A a) {
List<B> b = new ArrayList<>();
if (!a.getXList().isEmpty()) {
for (final X x : a.getXList()) {
b.add(new B(x.getDesc(), x.getXType()));
}
}
if (!a.getYList().isEmpty()) {
for (final Y y : a.getYList()) {
b.add(new B(y.getName(), y.getYType()));
}
}
if (!a.getZList().isEmpty()) {
for (final Z z : a.getZList()) {
b.add(new B(z.getDescription(), z.getZType()));
}
}
}
这里重复了if和for循环。
如何使用Java流实现这一点?
注意:类X
,Y
和Z
之间没有关系,也没有公共接口。
由于没有公共接口,因此必须使用forEach
方法迭代每个列表。
a.getXList().forEach(i -> b.add(new B(i.getDesc(), i.getXType())));
a.getYList().forEach(i -> b.add(new B(i.getName(), i.getYType())));
a.getZList().forEach(i -> b.add(new B(i.getDescription(), i.getZType())));
您可以使用流。concat()
如下所示
public List<B> convertList (A a) {
return Stream.concat(Stream.concat(a.getXList().stream().map(x -> new B(x.getDesc(), x.getXType()))
, a.getYList().stream().map(y -> new B(y.getName(), y.getYType())))
, a.getZList().stream().map(z -> new B(z.getDescription(), z.getZType()))).collect(Collectors.toList());
}
由于X
、Y
和Z
类型没有通用的超级类型,因此必须将它们转换为一些通用类型,例如Map。进入
您可以创建所有名称和类型对的
Stream
,然后将其映射到B
的实例:
List<B> b =
Stream.of(
a.getXList().stream().map(x -> new SimpleEntry<>(x.getDesc(),x.getXType())),
a.getYList().stream().map(y -> new SimpleEntry<>(y.getName(),y.getYType())),
a.getZList().stream().map(z -> new SimpleEntry<>(z.getDescription(),z.getZType())))
.flatMap(Function.identity())
.map(e -> new B(e.getKey(), e.getValue()))
.collect(Collectors.toList());
或者直接生成
B
实例:
List<B> b =
Stream.of(
a.getXList().stream().map(x -> new B(x.getDesc(),x.getXType())),
a.getYList().stream().map(y -> new B(y.getName(),y.getYType())),
a.getZList().stream().map(z -> new B(z.getDescription(),z.getZType())))
.flatMap(Function.identity())
.collect(Collectors.toList());
问题内容: 假设我有一个元组列表,并且我想转换为多个列表。 例如,元组列表是 Python中是否有任何内置函数可以将其转换为: 这可以是一个简单的程序。但是我只是对Python中存在这种内置函数感到好奇。 问题答案: 内置功能几乎可以满足您的需求: 唯一的区别是您得到元组而不是列表。您可以使用将它们转换为列表
如何使用stream转换下面的代码而不使用for each循环。 getAllSubjects()返回所有列表,每个主题都有。所有列表应合并为。 需要从中获取 对象模型:
鉴于 我有一个对象列表。 看起来像 我想将此转换为 i、 e.将个人类别整理成类别列表。 这是实现我想要的当前代码。 有什么方法可以使用流来做到这一点吗 这个问题在本质上类似于Group by和sum对象,比如SQLJavalambdas?但对我没有帮助,因为这里完成了聚合,而这里不是聚合。
我有2个对象ExpertJpa到ExpertDto的现有映射,需要另一个参数来过滤ExpertJpa。这个映射工作正常,现在我尝试将ExpertJpa列表转换为ExpertDto列表,我添加了第二个参数。 在构建时,我收到错误消息,即List是一个接口,不能是实例…… 错误:(53,18) java:返回类型java.util.List是一个抽象类或接口。提供非抽象/非接口结果类型或工厂方法。
我正在尝试将列表拆分为列表列表,其中每个列表的最大大小为4。 我想知道如何使用lambdas做到这一点。 目前我的做法如下: 更新 似乎没有一种简单的方法可以使用lambdas来拆分列表。虽然所有的答案都很受欢迎,但它们也是一个很好的例子,说明lambdas不能简化事情。
问题内容: 假设我有; 我尝试转换; 我现在正在vstack上通过迭代来解决它,但是对于特别大的LIST来说确实很慢 您对最佳有效方法有何建议? 问题答案: 通常,您可以沿任意轴连接整个数组序列: 但你 也 必须对列表中的形状和每个阵列的维度担心(用于2维3x5的输出,你需要确保它们都是2维正由-5阵列的话)。如果要将一维数组连接为二维输出的行,则需要扩展其维数。 正如Jorge的答案所指出的那样