use - java create iterable object




Converter o Java Array em Iterable (6)

Com o Java 8, você pode fazer isso.

final int[] arr = {1, 2, 3};
final PrimitiveIterator.OfInt i1 = Arrays.stream(arr).iterator();
final PrimitiveIterator.OfInt i2 = IntStream.of(arr).iterator();
final Iterator<Integer> i3 = IntStream.of(arr).boxed().iterator();

Eu tenho uma matriz de primitivos, por exemplo, para int, int [] foo. Pode ser um tamanho pequeno ou não.

int foo[] = {1,2,3,4,5,6,7,8,9,0};

Qual é a melhor maneira de criar um Iterable<Integer> partir dele?

Iterable<Integer> fooBar = convert(foo);

Notas:

Por favor, não responda usando loops (a menos que você possa dar uma boa explicação sobre como o compilador faz algo inteligente sobre eles?)

Observe também que

int a[] = {1,2,3};
List<Integer> l = Arrays.asList(a);

Não vai mesmo compilar

Type mismatch: cannot convert from List<int[]> to List<Integer>

Verifique também Por que uma matriz não pode ser designada para Iterable? antes de responder.

Além disso, se você usar alguma biblioteca (por exemplo, Guava), por favor, explique por que isso é o melhor. (Porque o seu do Google não é uma resposta completa: P)

Por último, uma vez que parece haver uma lição de casa sobre isso, evite postar código de trabalho de casa.


Embora uma resposta semelhante já tenha sido postada, acho que a razão para usar o novo PrimitiveIterator.OfInt não estava clara. Uma boa solução é usar o Java 8 PrimitiveIterator, já que é especializado em tipos int primitivos (e evita a penalidade extra de boxe / unboxing):

    int[] arr = {1,2,3};
    // If you use Iterator<Integer> here as type then you can't get the actual benefit of being able to use nextInt() later
    PrimitiveIterator.OfInt iterator = Arrays.stream(arr).iterator();
    while (iterator.hasNext()) {
        System.out.println(iterator.nextInt());
        // Use nextInt() instead of next() here to avoid extra boxing penalty
    }

Ref: https://doc.bccnsoft.com/docs/jdk8u12-docs/api/java/util/PrimitiveIterator.OfInt.html


Guava fornece o adaptador que você deseja como Int.asList() . Existe um equivalente para cada tipo primitivo na classe associada, por exemplo, Booleans para boolean , etc.

int foo[] = {1,2,3,4,5,6,7,8,9,0};
Iterable<Integer> fooBar = Ints.asList(foo);
for(Integer i : fooBar) {
    System.out.println(i);
}

As sugestões acima para usar o Arrays.asList não funcionarão, mesmo se elas forem compiladas porque você obtém um Iterator<int[]> ao invés do Iterator<Integer> . O que acontece é que, em vez de criar uma lista respaldada por sua matriz, você criou uma lista de matrizes de um elemento, contendo sua matriz.


No fluxo de java8 IntSteam pode ser encaixotado ao córrego de inteiros.

public static Iterable<Integer> toIterable(int[] ints) {
    return IntStream.of(ints).boxed().collect(Collectors.toList());
}

Eu acho que o desempenho é importante com base no tamanho da matriz.


Você pode usar IterableOf de Cactoos :

Iterable<String> names = new IterableOf<>(
  "Scott Fitzgerald", "Fyodor Dostoyevsky"
);

Então, você pode transformá-lo em uma lista usando ListOf :

List<String> names = new ListOf<>(
  new IterableOf<>(
    "Scott Fitzgerald", "Fyodor Dostoyevsky"
  )
);

Ou simplesmente isso:

List<String> names = new ListOf<>(
  "Scott Fitzgerald", "Fyodor Dostoyevsky"
);

apenas meus 2 centavos:

final int a[] = {1,2,3};

java.lang.Iterable<Integer> aIterable=new Iterable<Integer>() {

    public Iterator<Integer> iterator() {
       return new Iterator<Integer>() {
            private int pos=0;

            public boolean hasNext() {
               return a.length>pos;
            }

            public Integer next() {
               return a[pos++];
            }

            public void remove() {
                throw new UnsupportedOperationException("Cannot remove an element of an array.");
            }
        };
    }
};




iterable