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 subproject :server
/*
* 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.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;
import java.util.stream.StreamSupport;
public class Iterables {
/** 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) {
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();
}
}