我想將值設置爲對象的某個字段,以便它將首先獲取該字段的前一個值,並向其添加內容並將其設置爲該字段。LambdaJ for eachach
在LambdaJ forEach
我們可以做這樣的事情:
forEach(myCollection).setFieldValue("someValue");
但我需要的是:
forEach(myCollection).setFieldValue(getFieldValue() + "someValue");
是否有可能在LambdaJ?
我想將值設置爲對象的某個字段,以便它將首先獲取該字段的前一個值,並向其添加內容並將其設置爲該字段。LambdaJ for eachach
在LambdaJ forEach
我們可以做這樣的事情:
forEach(myCollection).setFieldValue("someValue");
但我需要的是:
forEach(myCollection).setFieldValue(getFieldValue() + "someValue");
是否有可能在LambdaJ?
我有一個類似的用例,並意識到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集合中的閉包。
UPDATE
我能夠用封閉來解決這一難題。看起來你不能使用自由變量直接。這裏是工作代碼:
@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
定義使用它。
我知道你問過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);
}
希望能幫到
我也使用公共收藏。 –
我遇到了一個片段,這讓我再次看到這個問題..這次我能夠改變自由變量的值;-) – Spindizzy