2013-11-01 20 views
5

Chcę ustawić wartość pola obiektu, aby najpierw uzyskać poprzednią wartość tego pola i dołączyć do niego coś oraz ustawić go do tego pola.LambdaJ forEach set

W LambdaJ forEach możemy zrobić coś takiego:

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

Ale to, co jest mi potrzebne:

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

Czy jest możliwe w LambdaJ?

Odpowiedz

1

Miałem podobny przypadek i zdałem sobie sprawę, że nic nie pomoże w sposób, w jaki go użyłem.

Więc pomyślałem zamknięcia są rozwiązaniem:

@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); 
    } 
} 

Ale nie twierdzi, ponieważ obiekt w kolekcji nie zostały zmodyfikowane. Może robię coś nie tak.

W końcu użyłem zamknięć z kolekcji apache commons.

UPDATE

udało mi się rozwiązać zagadkę z zamknięciem. Wygląda na to, że nie możesz użyć bezpośredniej zmiennej bezpośredniej. Oto kod roboczych:

@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); 
} 

Uwaga: zamiast this można również napisać klasy, która zawiera metodę visit i używać go w definicji closure.

+0

I również zbieranie wspólnych zbiorów. –

+0

Natknąłem się na fragment, który sprawił, że znów zacząłem analizować problem. Tym razem udało mi się zmienić wartość wolnej zmiennej ;-) – Spindizzy

4

Wiem, że pytałeś o LambdaJ, byłam ciekawa tego, ponieważ jest to powszechny problem.

byłem zaskoczony wynikiem mam robi:

forEach(list).setName(on(User.class).getName() + "someValue"); 

I chociaż byłoby to odpowiedź na swoje pytanie.

Próbowałem więc innego podejścia, stosując funkcjonalny sposób Guawy. Może pracować dla ciebie tak wyślę odpowiedź (ale mogę go usunąć, jeśli nie zgadzają się z nim):

Guava funkcjonalne podejście:

@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); 
    } 

nadzieję pomóc