复制ObservableList java

前端之家收集整理的这篇文章主要介绍了复制ObservableList java前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个MasterData,它是一个ObservableList和filteredData,它也是一个ObservableList.

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

  1. package br;
  2. import javafx.collections.FXCollections;
  3. import javafx.collections.ObservableList;
  4.  
  5. public class Main{
  6. private static ObservableList<Foo> masterData = FXCollections.observableArrayList();
  7. private static ObservableList<Foo> filteredData = FXCollections.observableArrayList();
  8. static Filter filter = new Filter();
  9. public static void addDummy(){
  10. masterData.add(new Foo("a",1));
  11. masterData.add(new Foo("aa",3));
  12. masterData.add(new Foo("b",2));
  13. masterData.add(new Foo("bb",4));
  14. masterData.add(new Foo("c",3));
  15. }
  16. public static void printData(ObservableList<Foo> list){
  17. for(Foo f: list) System.out.println(f.getName());
  18. }
  19. public static void main(String[] args) {
  20. addDummy();
  21. applyFilter(3);
  22. printData(filteredData);
  23. applyFilter(0);
  24. printData(filteredData);
  25. }
  26. public static void applyFilter(int num){
  27. filter.setData(masterData);
  28. filter.setFilter(num);
  29. filteredData = filter.getData();
  30. }
  31. }

类过滤器,我用来过滤数据:

  1. package br;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import javafx.collections.FXCollections;
  6. import javafx.collections.ObservableList;
  7.  
  8. public class Filter {
  9. private ObservableList<Foo> data = FXCollections.observableArrayList();
  10. public void setFilter(int filter){
  11. List<Foo> copy = new ArrayList<Foo>(data);
  12. for(Foo f: copy)
  13. if(f.getBar()<filter) data.remove(f);
  14. }
  15. public ObservableList<Foo> getData() {
  16. return data;
  17. }
  18.  
  19. public void setData(ObservableList<Foo> data) {
  20. this.data = data;
  21. }
  22.  
  23. }

而Foo类只是一个String Name和一个int bar(加上getter / setter)

  1. package br;
  2.  
  3. public class Foo {
  4. private String name;
  5. private int bar;
  6. public Foo(String name,int bar){
  7. this.setBar(bar);
  8. this.setName(name);
  9. }
  10. public String getName() {return name;}
  11. public void setName(String name) {this.name = name;}
  12. public int getBar() {return bar;}
  13. public void setBar(int bar) {this.bar = bar;}
  14. }

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

aa
bb
c

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

如何确保过滤器始终使用masterData中的数据进行处理,然后存储在filteredData上?

注意:这是一个JavaFX项目,所以我真的需要使用ObservableList.

解决方法

问题
  1. public void setData(ObservableList<Foo> data) {
  2. this.data = data;
  3. }

说明

如果您想知道Java遵守Pass By Value,并且masterData的值应该已被复制到列表数据.你是对的 !但是这个故事只是一点点扭曲

原始图像的变化,值被传递,但是对象的对象,对象引用被按值传递.

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

  1. this.data = FXCollections.observableArrayList(data);

这将创建一个新的对象以供数据引用,所有的操作都将在这个新对象的数据上完成.

猜你在找的Java相关文章