default boolean forEachColumnGroupRow(FacesContext context, ColumnGroup cg, boolean skipUnrendered, Predicate<Row> callback) {
        if (cg == null || cg.getChildCount() == 0) {
            return false;
        }
        for (UIComponent child : cg.getChildren()) {
            if (ComponentUtils.isUIRepeat(child)) {
                VisitContext visitContext = VisitContext.createVisitContext(context, null,
                        ComponentUtils.VISIT_HINTS_SKIP_UNRENDERED);
                child.visitTree(visitContext, (ctx, target) -> {
                    if (ComponentUtils.isUIRepeat(target)) {
                        return VisitResult.ACCEPT;
                    }

                    if (target instanceof Row) {
                        Row row = (Row) target;
                        if (!callback.test(row)) {
                            return VisitResult.COMPLETE;
                        }
                    }

                    return VisitResult.REJECT;
                });
            }
            else if (child instanceof Row) {
                Row row = (Row) child;
                if (skipUnrendered && !row.isRendered()) {
                    continue;
                }

                if (!callback.test(row)) {
                    return false;
                }
            }
        }
        return true;
    }
Return each {@link Row} in a Column Group.
@param context  the {@link FacesContext}
@param cg the {@link ColumnGroup} to get
@param skipUnrendered If unrendered components should be skipped
@param callback The callback, which will be invoked for each row. If it returns false, the algorithm will be cancelled
@return false when the algorithm was cancelled
primefaces/src/main/java/org/primefaces/component/api/ColumnAware.java