private void doFilterData() throws CancelledException {

		if (canReuseCurrentFilteredData()) {
			// the source data hasn't changed since the last filter, no need to refilter
			copyCurrentFilterData();
			return;
		}

		TableData<T> filterSourceData = sourceData;
		int size = filterSourceData.size();
		monitor.setMessage("Filtering " + model.getName() + " (" + size + " rows)...");

		List<T> list = filterSourceData.getData();
		List<T> result = model.doFilter(list, lastSortContext, monitor);
		if (result == list) { // yes, '=='
			// no filtering took place
			updatedData = filterSourceData;
		}
		else {
			// the derived data is sorted the same as the source data
			TableSortingContext<T> sortContext = filterSourceData.getSortContext();
			updatedData = TableData.createSubDataset(filterSourceData, result, sortContext);
			updatedData.setTableFilter(model.getTableFilter());
		}

		monitor.setMessage(
			"Done filtering " + model.getName() + " (" + updatedData.size() + " rows)");
	}
Work method to filter the data.
Ghidra/Framework/Docking/src/main/java/docking/widgets/table/threaded/TableUpdateJob.java