LambdaJ forEach set



我想为对象的字段设置值,以便它首先获取该字段的先前值,并向它附加一些内容并将其设置为该字段。

在 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的定义中使用它。

相关内容

  • 没有找到相关文章

最新更新