我想为对象的字段设置值,以便它首先获取该字段的先前值,并向它附加一些内容并将其设置为该字段。
在 LambdaJ forEach
中,我们可以做这样的事情:
forEach(myCollection).setFieldValue("someValue");
但我需要的是:
forEach(myCollection).setFieldValue(getFieldValue() + "someValue");
在 LambdaJ 中可能吗?
我知道你问过LambdaJ,我很好奇这样做,因为这是一个常见问题。
我对我得到的结果感到惊讶:
forEach(list).setName(on(User.class).getName() + "someValue");
我想这将是你问题的答案。
因此,我尝试了另一种方法,即使用番石榴功能方式。它可以为你工作,所以我会发布答案(但如果你不同意,我可以删除它):
番石榴功能方法:
@Test
public void test_applyPreviousValue() {
List<User> filteredList = Lists.newArrayList(new User("Fede", 20), new User("Peter", 12), new User("John", 41));
Function<User, User> getType = new Function<User, User>() {
public User apply(User input) {
input.setName(input.getName()+"someValue");
return input;
}
};
Collection<User> result = Collections2.transform(filteredList, getType);
System.out.println(result);
}
希望对您有所帮助
我有一个类似的用例,并意识到 forEach 对我使用它的方式没有帮助。
所以我认为闭包是一种解决方案:
@Test
public void test() {
Closure modify = closure();{
of(Point.class).setLocation(var(Point.class).x+10, 10);
}
List<Point> points = new ArrayList<>();
points.add(new Point(10, 0));
points.add(new Point(10, 10));
modify.each(points);
for (Point point : points) {
assertEquals(20, point.getX(), 0.0);
}
}
但是断言失败,因为集合中的对象未被修改。也许我在那里做错了什么。
最后,我使用了 apache commons 集合中的闭包。
更新
我能够通过闭合解决难题。看起来你不能直接使用自由变量。这是工作代码:
@Test
public void test() {
Closure modify = closure();{
of(this).visit(var(Point.class));
}
List<Point> points = new ArrayList<Point>();
points.add(new Point(10, 0));
points.add(new Point(10, 10));
modify.each(points);
for (Point point : points) {
assertEquals(20, point.getX(), 0.0);
}
}
void visit(Point p) {
p.setLocation(p.x + 10, p.y);
}
注意:除了this
,您还可以编写一个包含 visit
方法的类,并在closure
的定义中使用它。