用Java更新收集项目

时间:2018-08-13 20:22:25

标签: java list elasticsearch replace elasticsearch-painless

我正在尝试根据条件对集合项进行部分更新。这是Java代码段:

public class Point {
    public int x = 0;
    public int y = 0;

    public Point(int a, int b) {
        x = a;
        y = b;
    }

    public String toString() {
      return this.x + ":" + this.y;
    }
}


public class HelloWorld
{

  public static void main(String[] args)
  {
    Point p1 = new Point(1, 1);
    Point p2 = new Point(2, 2);

    Collection<Point> arr = new ArrayList<Point>();
    arr.add(p1);
    arr.add(p2);

    arr.stream().map(el -> el.x == 2 ? el.y : 20);

    System.out.println(Arrays.toString(arr.toArray()));
  }
}

如您所见,此函数返回:[1:1,2:2],但我想要的是:[1:1,2:20]

我相信该集合是不可变的,这就是为什么我不能就地修改该对象的原因。我的实际代码是ElasticSearch中的简单脚本:

ctx._source.points = ctx._source.points
    .stream()
    .map(point -> point.x == 2 ? point.y : 20);
    .collect(Collectors.toList())

我相信可以翻译成上述Java代码。

我在Java方面没有太多经验。这就是为什么我无法弄清楚哪种数据结构可以使我能够在Java中轻松使用ElasticSearch无痛脚本语言的列表元素进行变异。

2 个答案:

答案 0 :(得分:1)

您没有执行任何试图更改arr内容的操作。创建其元素流,然后将其映射到整数流,但随后对该流不执行任何操作。

您可能想要执行以下操作:

arr.stream().filter(p -> p.x == 2).forEach(p -> p.y = 20);

答案 1 :(得分:0)

如果您要修改收藏夹,则可能需要

arr = arr.stream()
            .map(point -> point.x == 2 ? new Point(point.x, 20) : point)
            .collect(Collectors.toList());