Wenn Sie keine Bedenken haben, eine Fremdbibliothek zu verwenden, hat Eclipse Collections zipWithIndex
und forEachWithIndex
verfügbar für viele Typen. Hier ist eine Reihe von Lösungen für diese Herausforderung für JDK-Typen und Eclipse Collections-Typen, die zipWithIndex
verwenden.
String[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" };
ImmutableList expected = Lists.immutable.with("Erik");
Predicate> predicate =
pair -> pair.getOne().length() <= pair.getTwo() + 1;
// JDK-Typen
List strings1 = ArrayIterate.zipWithIndex(names)
.collectIf(predicate, Pair::getOne);
Assert.assertEquals(expected, strings1);
List list = Arrays.asList(names);
List strings2 = ListAdapter.adapt(list)
.zipWithIndex()
.collectIf(predicate, Pair::getOne);
Assert.assertEquals(expected, strings2);
// Eclipse Collections-Typen
MutableList mutableNames = Lists.mutable.with(names);
MutableList strings3 = mutableNames.zipWithIndex()
.collectIf(predicate, Pair::getOne);
Assert.assertEquals(expected, strings3);
ImmutableList immutableNames = Lists.immutable.with(names);
ImmutableList strings4 = immutableNames.zipWithIndex()
.collectIf(predicate, Pair::getOne);
Assert.assertEquals(expected, strings4);
MutableList strings5 = mutableNames.asLazy()
.zipWithIndex()
.collectIf(predicate, Pair::getOne, Lists.mutable.empty());
Assert.assertEquals(expected, strings5);
Hier ist eine Lösung, die stattdessen forEachWithIndex
verwendet.
MutableList mutableNames =
Lists.mutable.with("Sam", "Pamela", "Dave", "Pascal", "Erik");
ImmutableList expected = Lists.immutable.with("Erik");
List actual = Lists.mutable.empty();
mutableNames.forEachWithIndex((name, index) -> {
if (name.length() <= index + 1)
actual.add(name);
});
Assert.assertEquals(expected, actual);
Wenn Sie die Lambdas oben in anonyme innere Klassen ändern, funktionieren alle diese Codebeispiele auch in Java 5 - 7.
Hinweis: Ich bin ein Mitwirkender für Eclipse Collections