blob: 06f3269b2399f0b93f2e9b0322315885024eb898 [file] [log] [blame]
/**
* 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 org.apache.aurora.common.base;
import java.util.List;
import java.util.function.Consumer;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Utilities for dealing with Consumers.
*
* @author John Sirois
*/
public final class Consumers {
private static final Consumer<?> NOOP = item -> {
// noop
};
private Consumers() {
// utility
}
/**
* Combines multiple consumers into a single consumer, whose calls are replicated sequentially
* in the order that they were provided.
* If an exception is encountered from a consumer it propagates to the top-level consumer and the
* remaining consumer are not executed.
*
* @param consumers Consumers to combine.
* @param <T> Type accepted by the consumers.
* @return A single consumer that will fan out all calls to {@link Consumer#accept(Object)} to
* the wrapped consumers.
*/
public static <T> Consumer<T> combine(List<Consumer<T>> consumers) {
checkNotNull(consumers);
checkArgument(Iterables.all(consumers, Predicates.notNull()));
return consumers.stream().reduce(noop(), Consumer::andThen);
}
/**
* Applies a filter to a consumer, such that the consumer will only be called when the filter is
* satisfied (returns {@code true}}.
*
* @param filter Filter to determine when {@code consumer} is called.
* @param consumer Consumer to filter.
* @param <T> Type handled by the filter and the consumer.
* @return A filtered consumer.
*/
public static <T> Consumer<T> filter(final Predicate<T> filter, final Consumer<T> consumer) {
checkNotNull(filter);
checkNotNull(consumer);
return item -> {
if (filter.apply(item)) {
consumer.accept(item);
}
};
}
/**
* Returns a consumer that will do nothing.
*
* @param <T> The consumer argument type.
* @return A consumer that does nothing.
*/
@SuppressWarnings("unchecked")
public static <T> Consumer<T> noop() {
return (Consumer<T>) NOOP;
}
}