
org.elasticsearch.common.util.iterable.Iterables Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of elasticsearch Show documentation
Show all versions of elasticsearch Show documentation
Elasticsearch - Open Source, Distributed, RESTful Search Engine
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
package org.elasticsearch.common.util.iterable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
public class Iterables {
@SafeVarargs
@SuppressWarnings("varargs")
public static Iterable concat(Iterable... inputs) {
Objects.requireNonNull(inputs);
return new ConcatenatedIterable<>(inputs);
}
static class ConcatenatedIterable implements Iterable {
private final Iterable[] inputs;
ConcatenatedIterable(Iterable[] inputs) {
this.inputs = Arrays.copyOf(inputs, inputs.length);
}
@Override
public Iterator iterator() {
return Stream
.of(inputs)
.map(it -> StreamSupport.stream(it.spliterator(), false))
.reduce(Stream::concat)
.orElseGet(Stream::empty).iterator();
}
}
/** Flattens the two level {@code Iterable} into a single {@code Iterable}. Note that this pre-caches the values from the outer {@code
* Iterable}, but not the values from the inner one. */
public static Iterable flatten(Iterable extends Iterable> inputs) {
Objects.requireNonNull(inputs);
return new FlattenedIterables<>(inputs);
}
static class FlattenedIterables implements Iterable {
private final Iterable extends Iterable> inputs;
FlattenedIterables(Iterable extends Iterable> inputs) {
List> list = new ArrayList<>();
for (Iterable iterable : inputs) {
list.add(iterable);
}
this.inputs = list;
}
@Override
public Iterator iterator() {
return StreamSupport
.stream(inputs.spliterator(), false)
.flatMap(s -> StreamSupport.stream(s.spliterator(), false)).iterator();
}
}
public static T get(Iterable iterable, int position) {
Objects.requireNonNull(iterable);
if (position < 0) {
throw new IllegalArgumentException("position >= 0");
}
if (iterable instanceof List) {
List list = (List)iterable;
if (position >= list.size()) {
throw new IndexOutOfBoundsException(Integer.toString(position));
}
return list.get(position);
} else {
Iterator it = iterable.iterator();
for (int index = 0; index < position; index++) {
if (it.hasNext() == false) {
throw new IndexOutOfBoundsException(Integer.toString(position));
}
it.next();
}
if (it.hasNext() == false) {
throw new IndexOutOfBoundsException(Integer.toString(position));
}
return it.next();
}
}
public static int indexOf(Iterable iterable, Predicate predicate) {
int i = 0;
for (T element : iterable) {
if (predicate.test(element)) {
return i;
}
i++;
}
return -1;
}
public static long size(Iterable> iterable) {
return StreamSupport.stream(iterable.spliterator(), true).count();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy