Предупреждение в Android Studio: можно заменить вызовом сбора.

Недавно я начал использовать библиотеку retrolambda для поддержки лямбда-выражений в разработке Android и получил следующее предупреждение от Android Studio:

Можно заменить колл-колл.

Эта проверка сообщает о циклах foreach, которые можно заменить вызовами потокового API.

Мой код выглядит следующим образом:

// mGeofenceList is a List<Geofence>
mGeofenceList = new ArrayList<>();
    // GeofenceUtils.GeofenceObjects.entrySet() is a HashMap<String, LatLng>
    for (Map.Entry<String, LatLng> entry : GeofenceUtils.GeofenceObjects.entrySet()) {
        mGeofenceList.add(new Geofence.Builder()
                .setRequestId(entry.getKey())
                .setCircularRegion(
                        entry.getValue().latitude,
                        entry.getValue().longitude,
                        GeofenceUtils.GEOFENCE_RADIUS_IN_METERS)
                .setExpirationDuration(GeofenceUtils.GEOFENCE_EXPIRATION_IN_MILLISECONDS)
                .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER |
                        Geofence.GEOFENCE_TRANSITION_EXIT)
                .build());
    }

Вопрос: Как я могу заменить его вызовом с оплатой?

ОБНОВЛЕНИЕ: когда я нажал alt+enter, он преобразовал код в следующий:

// method stream() cannot be found    
mGeofenceList.addAll(GeofenceUtils.GeofenceObjects.entrySet().stream()
            .map(entry -> new Geofence.Builder()
            .setRequestId(entry.getKey())
            .setCircularRegion(
                    entry.getValue().latitude,
                    entry.getValue().longitude,
                    GeofenceUtils.GEOFENCE_RADIUS_IN_METERS)
            .setExpirationDuration(GeofenceUtils.GEOFENCE_EXPIRATION_IN_MILLISECONDS)
            .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER |
                    Geofence.GEOFENCE_TRANSITION_EXIT)
            // Collectors cannot be found
            .build()).collect(java.util.stream.Collectors.toList()));

И теперь он говорит, что не может разрешить метод stream(), Collectors. Это поправимо? Могу ли я добавить несколько операторов импорта? Или в настоящее время он не поддерживается Retrolambda?

ОБНОВЛЕНИЕ: РЕШЕНО, см. ответ ниже.


person Dmytro Karataiev    schedule 05.04.2016    source источник
comment
посетите этот stackoverflow.com/questions/23127445/   -  person    schedule 05.04.2016
comment
@harshad, я видел этот ответ, и он не имеет ничего общего с моим вопросом.   -  person Dmytro Karataiev    schedule 05.04.2016
comment
Нажмите Alt+Enter, а затем замените его   -  person Nongthonbam Tonthoi    schedule 05.04.2016
comment
@ NonhonbamTonthoi, спасибо. Теперь он говорит, что не может разрешить поток, методы коллекторов.   -  person Dmytro Karataiev    schedule 05.04.2016
comment
Android не поддерживает Java 8. Не знаю, почему IDE думает, что вы можете. Вы должны изменить версию компиляции Java в настройках проекта   -  person OneCricketeer    schedule 05.04.2016
comment
@cricket_007, я добавил в проект ретролямбду (github.com/orfjackal/retrolambda), и это позволяет мне использовать лямбды с анонимными внутренними классами.   -  person Dmytro Karataiev    schedule 05.04.2016
comment
См. этот stackoverflow.com/questions/31528782/. Это может быть полезно для вас.   -  person Nongthonbam Tonthoi    schedule 05.04.2016


Ответы (1)


Спасибо всем, кто прокомментировал вопрос. Решил проблему с помощью этой библиотеки: https://github.com/aNNiMON/Lightweight-Stream-API

Stream.of(YourCollection) В реализации Java 8 вместо этого вы увидите YourCollection.stream(…). В любом случае создается экземпляр Stream.

Окончательный рабочий код с этой библиотекой:

// stream() changed to Stream.of( ... ) as per library specs
mGeofenceList.addAll(Stream.of(GeofenceUtils.GeofenceObjects.entrySet())
                .map(entry -> new Geofence.Builder()
                .setRequestId(entry.getKey())
                .setCircularRegion(
                        entry.getValue().latitude,
                        entry.getValue().longitude,
                        GeofenceUtils.GEOFENCE_RADIUS_IN_METERS)
               .setExpirationDuration(GeofenceUtils.GEOFENCE_EXPIRATION_IN_MILLISECONDS)
               .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT)

               // Collectors works without prefix
               .build()).collect(Collectors.toList()));
person Dmytro Karataiev    schedule 05.04.2016