假设我有一个类型的 Java 8 对象列表。并且该对象具有字段年龄。 我想找到一种 Java 8/stream 的方式来表示,如果年龄为 12,则分配给变量age12,如果年龄为 8,则分配给变量age8,如果年龄为10,则分配给变量age10,所有这些都在一次传递中完成。 我知道我可以有 3 个变量并执行一个 for 循环并实现它。 我怎样才能用流做到这一点?
如果我从字面上理解你,你想将年龄分配给它正确命名的字段。要在没有显式条件将年龄与字段相匹配的流中执行此操作,您可以使用反射。
以下示例打印
age8 = 8
age10 = 10
age12 = 12
方法
public class ToFields {
int age8;
int age10;
int age12;
public static void main(String[] args) {
new ToFields().start();
}
public void start() {
List<MyObject> list = Arrays.asList(new MyObject(8),new
MyObject(10), new MyObject(12));
list.stream()
.forEach(obj->{
try {
this.getClass().getDeclaredField("age"+obj.getAge())
.set(this, obj.getAge());
} catch(Exception e) {
e.printStackTrace();
}
});
System.out.println("age8 = " + age8);
System.out.println("age10 = " + age10);
System.out.println("age12 = " + age12);
}
}
class MyObject {
int age;
public MyObject(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
但是,在我看来,这充满了问题,而且不是一个很好的设计。我建议您简单地流式传输它们并将其存储在映射中,其中键按上述方式动态构造并分配伴随的值。
这就是它的样子。
toMap
的第一个参数是key
value
。(a,b)->a
- 是组合器。在这种情况下,它通过简单地将第一个存储在映射中来避免抛出重复的键异常。Map<String, Integer> result = list.stream()
.collect(Collectors.toMap(obj -> "age" + obj.getAge(),
MyObject::getAge,
(a,b)->a));
result.entrySet().forEach(System.out::println);
打印
age8=8
age12=12
age10=10