インデックス/範囲でループを強化したJava 8


8

Javaの拡張forループでインデックス/範囲を指定することは可能ですか?

例えば私はリストを持っています: List<String> list;

そして、0ではなくインデックス1からforループを実行したいと思います。

for(String s : list(start from index 1))

またはインデックス5まで

for(String s : list(end at index 5))

従来のforループを使用したり、拡張forループ内にカウンターを保持したりできることはわかっていますが、Javaまたはapacheコレクションにすぐに使えるものがあるのか​​知りたいのですが?

回答:


19

私はsubListこの場合に使用します:

for(String s : list.subList(1, list.size()))

そして

for(String s : list.subList(0, 6))

11

の使用sublistはより良いですが、ストリームバージョンはskipand を使用していlimitます:

list.stream().skip(1) .... limit(6)..... 

7

Java 8には、カスタムインデックスを使用してListを反復するために使用できるStream APIがあります。

List<String> evenIndexes = IntStream
  .range(0, names.length)
  .filter(i -> i % 2 == 0)
  .mapToObj(i -> names[i])
  .collect(Collectors.toList());

rangeこの方法、あなたは1から開始することができ、および/または5に繰り返します。


5

従来のforループは、この要件に対する「すぐに使える」ソリューションです。

for (int i = 1; i < list.size(); i++) {
    String s = list.get(i);
    ...
}

と(List少なくとも5つの要素がある場合):

for (int i = 0; i < 5; i++) {
    String s = list.get(i);
    ...
}

2

パフォーマンスのペナルティはわかりませんが、使用できます List::subList

List<String> list = Arrays.asList("a", "b", "c");

for (String s : list.subList(1, list.size())) {
        System.out.println(s);
}

出力

2
3

2
あなたは必要ありませんnew String []。あなたは単に書くことができますArrays.asList("a", "b", "c")subListは要素をコピーしないので、パフォーマンスの低下はあっても無視できます。
ホルガー

0

で可能ですがlist.subList(1, list.size())、サブリストのリストのパフォーマンスが低下します。この場合は、従来のforループを使用することをお勧めします。

//最初にサイズを計算して、反復ごとにループで計算されるパフォーマンスのペナルティを回避

int size = list.size();

for (int i = 1; i < size; i++) {
    String s = list.get(i);
    ...
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.