JEP286 - Использование индексов в расширенном цикле for - PullRequest
1 голос
/ 14 марта 2020

Я читал документацию по выводу типа локальной переменной по приведенной ниже ссылке Open JDK.

http://openjdk.java.net/jeps/286

Одна вещь привлекла мое внимание - " индексы в расширенном для-l oop ». Я посмотрел SO и не вижу, где обсуждаются индексы для l oop. До сих пор я понимал, что индексы допускаются только в традиционных циклах for (ясно, что я что-то упустил).

Не могли бы вы привести несколько примеров использования индексов в расширенном for-l oop?

Цели

Мы стремимся улучшить опыт разработчиков, уменьшив церемонию, связанную с написанием кода Java, сохраняя при этом приверженность Java к c безопасность типов, позволяя разработчикам исключить часто ненужное объявление манифеста типов локальных переменных. Эта функция позволила бы, например, объявления, такие как:

var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream();          // infers Stream<String>

Эта обработка будет ограничена локальными переменными с инициализаторами, индексы в расширенной for-l oop, и местные жители объявлены в традиционном цикле; он не будет доступен для формальных методов, конструкторов, типов возвращаемых методов, полей, формальных форм перехвата или любых других типов объявления переменных.

Ответы [ 2 ]

3 голосов
/ 14 марта 2020

Если вы дополнительно посмотрите на правила стиля , связанные в том же документе, вы можете найти хорошее предложение об использовании итератора в разделе «Примеры» с локальной переменной, такой как:

void removeMatches(Map<? extends String, ? extends Number> map, int max) {
    for (var iterator = map.entrySet().iterator(); iterator.hasNext(); ) {
        var entry = iterator.next();
        if (max > 0 && matches(entry)) {
            iterator.remove();
            max--;
        }
    }
}

Кроме того, для части индексов вы также можете сделать что-то вроде:

void removeMatchesIndexes(List<? extends Number> list, int max) {
    for (var i = 0; i < list.size(); i++) {
        var entry = list.get(i);
        if (entry.intValue() > max) {
            list.remove(entry);
        }
    }
}
2 голосов
/ 14 марта 2020

Это относится к переменной, объявленной с расширенным значением для l oop, например:

var elements = new Arraylist<String>();
// Fill the list
for (var element : elements) {
    // element is type String
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...