复制ObservableList java

我有一个MasterData,它是一个ObservableList和filteredData,它也是一个ObservableList。

然后,我想用它来设置filter时显示过滤后的数据 ,但也可以在必要时恢复 ,这里是MCVE:

package br; import javafx.collections.FXCollections; import javafx.collections.ObservableList; public class Main{ private static ObservableList masterData = FXCollections.observableArrayList(); private static ObservableList filteredData = FXCollections.observableArrayList(); static Filter filter = new Filter(); public static void addDummy(){ masterData.add(new Foo("a",1)); masterData.add(new Foo("aa",3)); masterData.add(new Foo("b",2)); masterData.add(new Foo("bb",4)); masterData.add(new Foo("c",3)); } public static void printData(ObservableList list){ for(Foo f: list) System.out.println(f.getName()); } public static void main(String[] args) { addDummy(); applyFilter(3); printData(filteredData); applyFilter(0); printData(filteredData); } public static void applyFilter(int num){ filter.setData(masterData); filter.setFilter(num); filteredData = filter.getData(); } } 

类filter,我用它来过滤数据:

 package br; import java.util.ArrayList; import java.util.List; import javafx.collections.FXCollections; import javafx.collections.ObservableList; public class Filter { private ObservableList data = FXCollections.observableArrayList(); public void setFilter(int filter){ List copy = new ArrayList(data); for(Foo f: copy) if(f.getBar()<filter) data.remove(f); } public ObservableList getData() { return data; } public void setData(ObservableList data) { this.data = data; } } 

还有Foo类,它只是一个String Name和一个int bar(加上getter / setters)

 package br; public class Foo { private String name; private int bar; public Foo(String name, int bar){ this.setBar(bar); this.setName(name); } public String getName() {return name;} public void setName(String name) {this.name = name;} public int getBar() {return bar;} public void setBar(int bar) {this.bar = bar;} } 

运行此代码时,您将获得:

AA
BB
C

当滤波器设置为3( 按预期过滤数据 )和滤波器“重置”为零之后

如何确保始终使用masterData中的数据处理filter,然后将其存储在filteredData上

注意:这是针对JavaFX项目的,所以我真的需要使用ObservableList。

问题

 public void setData(ObservableList data) { this.data = data; } 

说明

如果您想知道Java服从Pass By Value并且masterData的值应该已经复制到列表数据中 。 你是对的 ! 但这个故事只有一点点扭曲!

包含原语 ,传递值但是包含对象, 对象引用按值传递

因此,您正在引用masterData的Object,而不是将值复制到新List!

 this.data = FXCollections.observableArrayList(data); 

这将创建一个新的Object来引用数据 ,并且将对这个新对象的数据进行所有操作。