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

io.evitadb.utils.CollectorUtils Maven / Gradle / Ivy

/*
 *
 *                         _ _        ____  ____
 *               _____   _(_) |_ __ _|  _ \| __ )
 *              / _ \ \ / / | __/ _` | | | |  _ \
 *             |  __/\ V /| | || (_| | |_| | |_) |
 *              \___| \_/ |_|\__\__,_|____/|____/
 *
 *   Copyright (c) 2023
 *
 *   Licensed under the Business Source License, Version 1.1 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *   https://github.com/FgForrest/evitaDB/blob/master/LICENSE
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 */

package io.evitadb.utils;

import java.util.Collections;
import java.util.EnumSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
import java.util.stream.Collectors;

/**
 * Copy of {@link Collectors} methods that are not available in JDK.
 *
 * @author Jan Novotný ([email protected]), FG Forrest a.s. (c) 2023
 */
public class CollectorUtils {
	static final Set CH_UNORDERED_NOID
		= Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.UNORDERED));

	/**
	 * Returns a {@code Collector} that accumulates the input elements into an
	 * unmodifiable Set. The returned
	 * Collector disallows null values and will throw {@code NullPointerException}
	 * if it is presented with a null value. If the input contains duplicate elements,
	 * an arbitrary element of the duplicates is preserved.
	 *
	 * 

This is an {@link Collector.Characteristics#UNORDERED unordered} * Collector. * * @param the type of the input elements * @return a {@code Collector} that accumulates the input elements into an * unmodifiable Set * @see Collectors#toUnmodifiableSet() */ @SuppressWarnings("unchecked") public static Collector> toUnmodifiableLinkedHashSet() { return new CollectorImpl<>(LinkedHashSet::new, Set::add, (left, right) -> { if (left.size() < right.size()) { right.addAll(left); return right; } else { left.addAll(right); return left; } }, set -> (Set)Collections.unmodifiableSet(set), CH_UNORDERED_NOID); } @SuppressWarnings("unchecked") private static Function castingIdentity() { return i -> (R) i; } /** * Simple implementation class for {@code Collector}. * * @param the type of elements to be collected * @param the type of the result */ static class CollectorImpl implements Collector { private final Supplier supplier; private final BiConsumer accumulator; private final BinaryOperator combiner; private final Function finisher; private final Set characteristics; CollectorImpl(Supplier supplier, BiConsumer accumulator, BinaryOperator combiner, Function finisher, Set characteristics) { this.supplier = supplier; this.accumulator = accumulator; this.combiner = combiner; this.finisher = finisher; this.characteristics = characteristics; } CollectorImpl(Supplier supplier, BiConsumer accumulator, BinaryOperator combiner, Set characteristics) { this(supplier, accumulator, combiner, castingIdentity(), characteristics); } @Override public BiConsumer accumulator() { return accumulator; } @Override public Supplier supplier() { return supplier; } @Override public BinaryOperator combiner() { return combiner; } @Override public Function finisher() { return finisher; } @Override public Set characteristics() { return characteristics; } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy