com.cinchapi.common.collect.Sequences Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of accent4j Show documentation
Show all versions of accent4j Show documentation
Accent4J is a suite of libraries, helpers and data structures that make Java programming idioms more fluent.
/*
* Copyright (c) 2013-2018 Cinchapi Inc.
*
* 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.cinchapi.common.collect;
import java.lang.reflect.Array;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Stream;
import com.google.common.base.Preconditions;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Streams;
/**
* Utility functions for dealing with sequences.
*
*
* A Sequence is a one-dimensional container object. In Java, this includes
* {@link Iterable} objects and {@link Array arrays}. Since these types have
* divergent class hierarchies, these functions provide implementations for
* common operations.
*
*
* @author Jeff Nelson
*/
public final class Sequences {
/**
* Return {@code true} if the {@link Class cls} is a sequence type.
*
* @param cls
* @return {@code true} if the class is a sequence type
*/
public static boolean isSequenceType(Class> cls) {
return Iterable.class.isAssignableFrom(cls) || cls.isArray();
}
/**
* Return {@code true} if the {@code object} is a sequence.
*
* @param object
* @return {@code true} if the object is a sequence
*/
public static boolean isSequence(Object object) {
return isSequenceType(object.getClass());
}
/**
* Performs the given action for each element of the {@code sequence} until
* all elements have been processed or the action throws an exception.
* Unless otherwise specified by the implementing class, actions are
* performed in the order of iteration (if an iteration order is specified).
* Exceptions thrown by the action are relayed to the caller.
*
* @param sequence
* @param action
*/
@SuppressWarnings("unchecked")
public static void forEach(Object sequence, Consumer action) {
if(sequence instanceof Iterable) {
((Iterable) sequence).forEach(action);
}
else if(sequence.getClass().isArray()) {
for (int i = 0; i < Array.getLength(sequence); ++i) {
T item = (T) Array.get(sequence, i);
action.accept(item);
}
}
else {
throw new IllegalArgumentException(
sequence + "is not a valid sequence");
}
}
@SuppressWarnings("unchecked")
public static boolean contains(Object sequence, T element) {
Preconditions.checkArgument(isSequence(sequence),
sequence + " is not a valid sequence");
if(sequence instanceof Iterable) {
return Iterables.contains((Iterable) sequence, element);
}
else {
return stream(sequence).filter(Predicate.isEqual(element))
.count() > 0;
}
}
/**
* Return a {@link Stream} for the {@code sequence}.
*
* @param sequence
* @return a stream
* @throws IllegalArgumentException if the parameter is not a
* {@link #isSequence(Object) sequence}
*/
@SuppressWarnings("unchecked")
public static Stream stream(Object sequence) {
Preconditions.checkArgument(isSequence(sequence),
sequence + " is not a valid sequence");
if(sequence instanceof Iterable) {
return Streams.stream((Iterable) sequence);
}
else {
List gathered = Lists.newArrayList();
forEach(sequence, e -> gathered.add((T) e));
return gathered.stream();
}
}
private Sequences() {/* no-init */}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy