/*
 * Copyright (c) 2016, nwillc@gmail.com
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 */

package almost.functional.utils;

import almost.functional.Function;
import almost.functional.Predicate;

import java.util.Objects;


/**
 * @Since 1.6+
 */
public final class Equals {
    private Equals() {
    }

    public static <T> boolean equals(final T one, final T two, Function<? super T, ?>... accessors) {
        return one == two ||
                !(one == null || two == null) &&
                        Stream.of(accessors).allMatch(new Predicate<Function<? super T, ?>>() {
                            @Override
                            public boolean test(Function<? super T, ?> accessor) {
                                return Objects.equals(accessor.apply(one), accessor.apply(two));
                            }
                        });
    }
}

/*
 * Copyright (c) 2016, nwillc@gmail.com
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 */

package almost.functional.utils;

import almost.functional.Function;
import almost.functional.Predicate;

import java.util.Objects;


/**
 * @Since 1.6+
 */
public final class Equals {
    private Equals() {}

    public static <T> boolean equals(final T one, final T two, Function<? super T, ?>... accessors) {
        return one == two ||
                !(one == null || two == null) &&
                        Stream.of(accessors).allMatch(new Predicate<Function<? super T, ?>>() {
                            @Override
                            public boolean test(Function<? super T, ?> accessor) {
                                return Objects.equals(accessor.apply(one), accessor.apply(two));
                            }
                        });
    }
}

Add Equals utility