2013-11-01 82 views
5

我想將值設置爲對象的某個字段,以便它將首先獲取該字段的前一個值,並向其添加內容並將其設置爲該字段。LambdaJ for eachach

在LambdaJ forEach我們可以做這樣的事情:

forEach(myCollection).setFieldValue("someValue");

但我需要的是:

forEach(myCollection).setFieldValue(getFieldValue() + "someValue");

是否有可能在LambdaJ?

回答

1

我有一個類似的用例,並意識到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定義使用它。

+0

我也使用公共收藏。 –

+0

我遇到了一個片段,這讓我再次看到這個問題..這次我能夠改變自由變量的值;-) – Spindizzy

4

我知道你問過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); 
    } 

希望能幫到