复制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来引用数据 ,并且将对这个新对象的数据进行所有操作。