微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

复制ObservableList java

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

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

package br;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

public class Main{
    private static ObservableList<Foo> masterData = FXCollections.observableArrayList();
    private static ObservableList<Foo> 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<Foo> 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();
    }
}

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

package br;

import java.util.ArrayList;
import java.util.List;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

public class Filter {
    private ObservableList<Foo> data = FXCollections.observableArrayList();
    public void setFilter(int filter){
        List<Foo> copy = new ArrayList<Foo>(data);
        for(Foo f: copy)
            if(f.getBar()<filter) data.remove(f);
    }
    public ObservableList<Foo> getData() {
        return data;
    }

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

}

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

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中的数据进行处理,然后存储在filteredData上?

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

解决方法

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

说明

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

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

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

this.data = FXCollections.observableArrayList(data);

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


应用场景 C端用户提交工单、工单创建完成之后、会发布一条工单创建完成的消息事件(异步消息)、MQ消费者收到消息之后、会通知各处理器处理该消息、各处理器处理完后都会发布一条将该工单写入搜索引擎的消息、最终该工单出现在搜索引擎、被工单处理人检索和处理。 事故异常体现 1、异常体现 从工单的流转记录发现、
线程类,设置有一个公共资源 package cn.org.chris.concurrent; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @Descrip
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量
Java 9中JShell中的不同启动脚本是什么?
使用Java的位填充错误检测技术
java中string是什么
如何使用Java中的JSON-lib API将Map转换为JSON对象?