Przeczytałem ten post tutaj. Ale nadal nie mogę uruchomić kodu zawierającego funkcje Java 8 Stream API, takie jak poniższe na minSdkVersion <24.
List<Car> newCars = cars.stream()
.filter(s -> s.getColor().equals("red"))
.collect(Collectors.toList());
To nie działa z powodu komunikatu o błędzie
Wywołanie wymaga interfejsu API na poziomie 24 (obecnie minimum to 15): java.util.Collection # stream
Czy ktoś zna rozwiązanie?
java
android
java-8
java-stream
nieograniczony101
źródło
źródło
Odpowiedzi:
[oryginalna odpowiedź]
Nie można używać strumieni Java8 na poziomie API <24.
Istnieją jednak biblioteki, które obsługują niektóre funkcje strumienia
https://github.com/aNNiMON/Lightweight-Stream-API
https://github.com/konmik/solid
https://sourceforge.net/projects/streamsupport/ (wspomniane przez @sartorius w komentarzu)
[aktualizacja k3b 2019-05-23]
https://github.com/retrostreams/android-retrostreams to spinoff ze streamsupport, który wykorzystuje możliwości Android Studio 3.x D8 / desugar toolchain do używania domyślnych i statycznych metod interfejsu w granicach plików Jar. Istnieją również linki do innych android-retroXXX, tj. Dla CompletableFuture.
[aktualizacja aeracode 2020-07-24]
Dobra wiadomość , teraz możemy używać Java 8 Stream API i więcej bez wymagania minimalnego poziomu API .
źródło
Od wersji 8.2 DexGuard możliwe jest korzystanie z Java 8 strumieni API również na urządzeniach z systemem Android <poziom API 24. Aby to zrobić, trzeba zawierać streamsupport bibliotekę i DexGuard przełoży wszystkie Java 8 strumieniowych wywołań API do dostarczonego biblioteka. Nie jest wymagana żadna dodatkowa obsługa, a programiści mogą po prostu kodować za pomocą dostarczonego interfejsu API strumieni Java 8. Zależności są również tłumaczone automatycznie, więc możliwe jest wykorzystanie bibliotek z funkcjami Java 8 również do programowania na Androida.
Ta funkcja będzie również dostępna w ProGuard w najbliższej przyszłości, bądźcie czujni.
Edycja: Proguard 6.1.0, dla którego istnieje już wersja beta, obsługuje backportowanie strumieni Java 8 i API czasu.
źródło
Może być trochę za późno na imprezę, ale właśnie zobaczyłem, że jeśli użyjemy
java8.util.stream.StreamSupport
, możemy uruchomić to samo podejście do programowania funkcjonalnego i używać go przed Api 24. Np. Wzięte z web3j -źródło
Java 8 Stream API
, czuję, że odpowiedź powinna być również w JAVA!Tak, jest ! Począwszy od AGP 4.0.0 możemy używać Stream API i kilku innych API Java 8+ (np.
java.time
)Minimalne wymagane zmiany w pliku build.gradle Twojej aplikacji :
android { compileOptions { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true } } dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9' }
źródło
Innym rozwiązaniem, które lubię używać, jest statyczne używanie rozszerzeń Kotlina nad kolekcjami z kodu Java, jeśli projekt obsługuje oba oczywiście :
List<Car> newCars = CollectionsKt.filter(cars, s -> s.getColor().equals("red"));
Sam dla
.map
,.reduce
,.first
, ... etcźródło
Utwórz interfejs İnterface.
public interface Pre<T,R> { R get(T item); }
Utwórz metodę filtrowania.
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; } }
Korzystanie z kodu
public static class model { public String Name; } List<model> models = new ArrayList<>(); ... List<model> filtermodels = Filter(models,p-> p.Name.equals("filter"));
źródło