100 votes

Est-il possible d'utiliser l'API Java 8 Stream sur une API Android <24?

J'ai lu ce post ici. Mais encore, je ne peut pas exécuter de code contenant Java 8 Flux fonctionnalités de l'API comme suit sur minSdkVersion < 24.

List<Car> newCars = cars.stream()
                        .filter(s -> s.getColor().equals("red"))
                        .collect(Collectors.toList());

Ce n'est pas exécutée en raison du message d'erreur

Appel nécessite l'API de niveau 24 (actuelle est à 15 min): java.util.Collection#stream

Ainsi, quelqu'un connais une solution?

87voto

Robert Estivill Points 3202

Vous ne pouvez pas utiliser Java8 cours d'eau sur l'API de niveau < 24.

Cependant, il existe certaines bibliothèques backport certains des flux de fonctionnalité

https://github.com/aNNiMON/Lightweight-Stream-API

https://github.com/konmik/solid

https://sourceforge.net/projects/streamsupport/ (mentionné par @sartorius en commentaire)

15voto

T. Neidhart Points 3948

Depuis la version 8.2 de DexGuard il est possible d'utiliser le Java 8 API de flux aussi sur les appareils Android < API de niveau 24. Pour ce faire, on doit inclure le streamsupport bibliothèque et DexGuard se traduira tous Java 8 flux des appels d'API de la bibliothèque fournis. Aucun traitement supplémentaire n'est nécessaire, et les développeurs peuvent simplement le code à l'aide du Java 8 API de flux. Les dépendances sont également traduits automatiquement, de sorte qu'il est possible d'utiliser des bibliothèques de Java 8 dispose également de développement Android.

Cette fonctionnalité sera également inclus dans ProGuard dans un avenir proche, restez à l'écoute.

Edit: Proguard 6.1.0 pour lesquels il existe déjà une version beta prend en charge le portage de Java 8 flux et l'heure de l'API.

-6voto

Yusuf Aydın Points 1

Créer une interface.

 public interface Pre<T,R> {
            R get(T item);
        }
 

Créer une méthode de filtrage.

 public static  <T> List<T> Filter(List<T> list, Pre<T,Boolean> pre) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
        {
            return list.stream().filter(p -> pre.get(p)).collect(Collectors.toList());
        }
        else
        {
            List<T> col = new ArrayList<T>();
            for (int i = 0 ; i < list.size() ; i++)
                if (pre.get(list.get(i)))
                    col.add(list.get(i));
            return col;
        }
    }
 

Utiliser le code

     public static class model {
            public String Name;
        }
List<model> models = new ArrayList<>();
            ...
            List<model> filtermodels = Filter(models,p-> p.Name.equals("filter"));
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X