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

com.github.dm.jrt.function.ConsumerWrapper Maven / Gradle / Ivy

There is a newer version: 5.9.0
Show newest version
/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * 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 com.github.dm.jrt.function;

import com.github.dm.jrt.util.Reflection;

import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.List;

/**
 * Class wrapping a consumer instance.
 * 

* Created by davide-maestroni on 10/11/2015. * * @param the input data type. */ public class ConsumerWrapper implements Consumer { private final List> mConsumers; /** * Constructor. * * @param consumers the list of wrapped consumers. */ ConsumerWrapper(@NotNull final List> consumers) { if (consumers.isEmpty()) { throw new IllegalArgumentException("the list of consumers must not be empty"); } mConsumers = consumers; } @SuppressWarnings("unchecked") public void accept(final IN in) { for (final Consumer consumer : mConsumers) { ((Consumer) consumer).accept(in); } } /** * Returns a composed consumer wrapper that performs, in sequence, this operation followed by * the after operation. * * @param after the operation to perform after this operation. * @return the composed consumer. */ @NotNull public ConsumerWrapper andThen(@NotNull final Consumer after) { final Class consumerClass = after.getClass(); final List> consumers = mConsumers; final ArrayList> newConsumers = new ArrayList>(consumers.size() + 1); newConsumers.addAll(consumers); if (consumerClass == ConsumerWrapper.class) { newConsumers.addAll(((ConsumerWrapper) after).mConsumers); } else { newConsumers.add(after); } return new ConsumerWrapper(newConsumers); } /** * Checks if the consumers wrapped by this instance have a static context. * * @return whether the consumers have a static context. */ public boolean hasStaticContext() { for (final Consumer consumer : mConsumers) { if (!Reflection.hasStaticContext(consumer.getClass())) { return false; } } return true; } @Override public int hashCode() { int result = 0; for (final Consumer consumer : mConsumers) { result = 31 * result + consumer.getClass().hashCode(); } return result; } @Override public boolean equals(final Object o) { if (this == o) { return true; } if ((o == null) || (getClass() != o.getClass())) { return false; } final ConsumerWrapper that = (ConsumerWrapper) o; final List> thisConsumers = mConsumers; final List> thatConsumers = that.mConsumers; final int size = thisConsumers.size(); if (size != thatConsumers.size()) { return false; } for (int i = 0; i < size; ++i) { if (thisConsumers.get(i).getClass() != thatConsumers.get(i).getClass()) { return false; } } return true; } }