All Downloads are FREE. Search and download functionalities are using the official Maven repository.

shz.core.node.DNode Maven / Gradle / Ivy

package shz.core.node;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;

/**
 * 双向链表节点
 */
@SuppressWarnings("unchecked")
public interface DNode> {
    T next();

    void next(T node);

    T prev();

    void prev(T node);

    default T addNext(T node) {
        node.prev((T) this);
        node.next(next());
        next().prev(node);
        next(node);
        return node;
    }

    default T addPrev(T node) {
        node.prev(prev());
        node.next((T) this);
        prev().next(node);
        prev(node);
        return node;
    }

    default void poll() {
        if (prev() != null) prev().next(next());
        if (next() != null) next().prev(prev());
        prev(null);
        next(null);
    }

    default T findNext(Predicate predicate) {
        if (predicate == null) return null;
        for (T next = (T) this; next != null; next = next.next()) if (predicate.test(next)) return next;
        return null;
    }

    default T findPrev(Predicate predicate) {
        if (predicate == null) return null;
        for (T prev = (T) this; prev != null; prev = prev.prev()) if (predicate.test(prev)) return prev;
        return null;
    }

    default void forEachNext(Function func) {
        if (func == null) return;
        for (T next = (T) this; next != null; next = next.next()) {
            Boolean stop = func.apply(next);
            if (stop != null && stop) break;
        }
    }

    default void forEachPrev(Function func) {
        if (func == null) return;
        for (T prev = (T) this; prev != null; prev = prev.prev()) {
            Boolean stop = func.apply(prev);
            if (stop != null && stop) break;
        }
    }

    default void forEachNext(Consumer consumer) {
        if (consumer == null) return;
        for (T next = (T) this; next != null; next = next.next()) consumer.accept(next);
    }

    default void forEachPrev(Consumer consumer) {
        if (consumer == null) return;
        for (T prev = (T) this; prev != null; prev = prev.prev()) consumer.accept(prev);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy