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

com.cinchapi.common.collect.Sequences Maven / Gradle / Ivy

Go to download

Accent4J is a suite of libraries, helpers and data structures that make Java programming idioms more fluent.

There is a newer version: 1.13.1
Show newest version
/*
 * 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