正在更新 Java 中的 collection 项
Updating collection items in Java
我正在尝试根据条件对 collection 项进行部分更新。这是 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()));
}
}
正如你看到的这个函数returns: [1:1, 2:2], 但我想要的是: [1:1, 2:20]
我相信 collection 是不可变的,这就是为什么我不能就地修改 object。我的实际代码是 ElasticSearch 中的无痛脚本:
ctx._source.points = ctx._source.points
.stream()
.map(point -> point.x == 2 ? point.y : 20);
.collect(Collectors.toList())
我认为这可以转化为上面的 Java 代码。
我在Java方面经验不多。这就是为什么我无法弄清楚哪种数据结构可以让我改变 Java 中的列表元素,而我可以在 ElasticSearch 无痛脚本语言中使用。
您没有执行任何试图更改 arr
内容的操作。您创建了它的元素流,然后将其映射到整数流,但随后您不对该流进行任何操作。
您可能想要执行以下操作:
arr.stream().filter(p -> p.x == 2).forEach(p -> p.y = 20);
如果你想修改你的collection,你可能需要这个
arr = arr.stream()
.map(point -> point.x == 2 ? new Point(point.x, 20) : point)
.collect(Collectors.toList());
我正在尝试根据条件对 collection 项进行部分更新。这是 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()));
}
}
正如你看到的这个函数returns: [1:1, 2:2], 但我想要的是: [1:1, 2:20]
我相信 collection 是不可变的,这就是为什么我不能就地修改 object。我的实际代码是 ElasticSearch 中的无痛脚本:
ctx._source.points = ctx._source.points
.stream()
.map(point -> point.x == 2 ? point.y : 20);
.collect(Collectors.toList())
我认为这可以转化为上面的 Java 代码。
我在Java方面经验不多。这就是为什么我无法弄清楚哪种数据结构可以让我改变 Java 中的列表元素,而我可以在 ElasticSearch 无痛脚本语言中使用。
您没有执行任何试图更改 arr
内容的操作。您创建了它的元素流,然后将其映射到整数流,但随后您不对该流进行任何操作。
您可能想要执行以下操作:
arr.stream().filter(p -> p.x == 2).forEach(p -> p.y = 20);
如果你想修改你的collection,你可能需要这个
arr = arr.stream()
.map(point -> point.x == 2 ? new Point(point.x, 20) : point)
.collect(Collectors.toList());