Java 8 được tăng cường cho vòng lặp với chỉ mục / phạm vi


8

Có thể chỉ định một chỉ mục / phạm vi được tăng cường cho vòng lặp trong Java không?

Ví dụ: tôi có một danh sách: List<String> list;

Và tôi muốn chạy một vòng lặp for từ chỉ số 1 thay vì 0:

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

HOẶC cho đến chỉ số 5

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

Tôi biết tôi có thể sử dụng vòng lặp truyền thống hoặc giữ một bộ đếm bên trong vòng lặp nâng cao nhưng tôi muốn biết có cái gì đó nằm ngoài hộp trong các bộ sưu tập Java hay apache không?

Câu trả lời:


19

Tôi sẽ sử dụng subListtrong trường hợp này:

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

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

11

Sử dụng sublistlà tốt hơn nhưng phiên bản truyền phát đang sử dụng skiplimit:

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

7

Trong Java 8, chúng tôi có API Stream, chúng tôi có thể sử dụng để lặp lại Danh sách với các chỉ mục tùy chỉnh:

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

trong rangephương thức, bạn có thể bắt đầu từ 1 và / hoặc lặp lại thành 5.


5

Vòng lặp for truyền thống là giải pháp "ngoài luồng" cho yêu cầu này:

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

và (nếu Listcó ít nhất 5 yếu tố):

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

2

Tôi không chắc chắn về hình phạt hiệu suất, nhưng bạn có thể sử dụng List::subList

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

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

đầu ra

2
3

2
Bạn không cần new String []; bạn chỉ có thể viết Arrays.asList("a", "b", "c"). Vì subListkhông sao chép các yếu tố, hình phạt hiệu suất là không đáng kể, nếu có.
Holger

0

Có thể với list.subList(1, list.size()), nhưng nó sẽ thêm hình phạt hiệu suất cho danh sách phụ. Tốt hơn là sử dụng vòng lặp truyền thống trong trường hợp này.

// Tính kích thước trước để tránh tính toán hiệu suất trong vòng lặp mỗi lần lặp

int size = list.size();

for (int i = 1; i < size; i++) {
    String s = list.get(i);
    ...
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.