2013-11-01 11 views
5

Desidero impostare un valore su un campo di un oggetto in modo tale da ottenere prima il valore precedente di quel campo e aggiungere qualcosa ad esso e impostarlo su quel campo.LambdaJ forEach set

In LambdaJ forEach possiamo fare qualcosa di simile:

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

Ma quello che mi serve è:

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

E 'possibile in LambdaJ?

risposta

1

Avevo un caso simile e mi sono reso conto cheEach non mi avrebbe aiutato nel modo in cui l'ho usato.

così ho pensato chiusure sono una soluzione:

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

Ma l'afferma fallisce in quanto l'oggetto della collezione non è stata modificata. Forse sto facendo qualcosa di sbagliato lì.

Alla fine ho usato chiusure dalla collezione di apache commons.

UPDATE

sono stato in grado di risolvere il puzzle con una chiusura. Sembra che tu non possa usare la variabile gratuita diretta. Ecco il codice di lavoro:

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

Nota: invece di this si può anche scrivere una classe che contiene il metodo visit e utilizzarlo nella definizione del closure.

+0

I anche la raccolta di beni usati. –

+0

Mi sono imbattuto in un frammento, il che mi ha fatto guardare ancora il problema ... questa volta sono stato in grado di cambiare il valore della variabile libera ;-) – Spindizzy

4

So che hai chiesto di LambdaJ, ero curioso di farlo visto che è un problema comune.

Sono rimasto sorpreso del risultato ho ottenuto facendo:

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

ho pensato che sarebbe la risposta alla tua domanda.

Quindi, ho provato un approccio diverso utilizzando il modo funzionale Guava. Può funzionare per voi così vi posto la risposta (ma posso eliminarlo se non sei d'accordo con lui):

Guava approccio funzionale:

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

speranza di aiutare