Saya telah membaca posting ini di sini. Tapi tetap saja saya tidak bisa menjalankan kode yang berisi fitur Java 8 Stream API seperti berikut di minSdkVersion <24.
List<Car> newCars = cars.stream()
.filter(s -> s.getColor().equals("red"))
.collect(Collectors.toList());
Ini tidak berjalan karena pesan kesalahan
Panggilan memerlukan API level 24 (minimum saat ini 15): java.util.Collection # stream
Jadi, apakah seseorang tahu solusinya?
java
android
java-8
java-stream
tidak terbatas101
sumber
sumber
Jawaban:
[jawaban asli]
Anda tidak dapat menggunakan aliran Java8 pada API level <24.
Namun, ada beberapa pustaka yang mendukung beberapa fungsionalitas aliran
https://github.com/aNNiMON/Lightweight-Stream-API
https://github.com/konmik/solid
https://sourceforge.net/projects/streamsupport/ (disebutkan oleh @sartorius dalam komentar)
[perbarui k3b 2019-05-23]
https://github.com/retrostreams/android-retrostreams adalah spin-off dari streamsupport yang memanfaatkan kemampuan Android Studio 3.x D8 / desugar toolchain untuk menggunakan metode default & statis antarmuka melintasi batas file Jar. Ada juga tautan ke android-retroXXX lainnya yaitu untuk CompletableFuture.
[perbarui aeracode 24-07-2020]
Kabar baiknya , sekarang kita dapat menggunakan Java 8 Stream API dan lainnya tanpa memerlukan level API minimum .
sumber
Sejak rilis 8.2 dari DexGuard adalah mungkin untuk menggunakan Java 8 stream API juga pada perangkat Android <API tingkat 24. Untuk melakukannya, salah satu kebutuhan untuk menyertakan streamsupport perpustakaan dan DexGuard akan menerjemahkan semua Java 8 aliran API panggilan ke yang disediakan Perpustakaan. Tidak diperlukan penanganan tambahan, dan pengembang cukup membuat kode menggunakan API aliran Java 8 yang disediakan. Dependensi juga diterjemahkan secara otomatis, sehingga memungkinkan untuk menggunakan pustaka dengan fitur Java 8 juga untuk pengembangan Android.
Fitur ini juga akan disertakan dalam ProGuard dalam waktu dekat, pantau terus.
Sunting: Proguard 6.1.0 yang sudah ada versi beta mendukung backporting aliran Java 8 dan API waktu.
sumber
Mungkin agak terlambat ke pesta, tapi saya hanya melihat bahwa Jika kita menggunakan
java8.util.stream.StreamSupport
maka kita dapat menjalankan pendekatan pemrograman fungsional yang sama dan menggunakannya sebelum Api 24. Misalnya diambil dari web3j -sumber
Java 8 Stream API
, saya rasa, jawabannya juga harus di JAWA!Ya, benar ! Mulai dari AGP 4.0.0 kita dapat menggunakan Stream API dan beberapa Java 8+ API lainnya (mis.
java.time
)Perubahan minimal yang diperlukan pada build.gradle aplikasi Anda :
android { compileOptions { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true } } dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9' }
sumber
Solusi lain yang suka saya gunakan adalah menggunakan ekstensi Kotlin secara statis di atas Koleksi dari kode Java, jika proyek tersebut mendukung keduanya tentu saja :
List<Car> newCars = CollectionsKt.filter(cars, s -> s.getColor().equals("red"));
Sama untuk
.map
,.reduce
,.first
, ... dllsumber
Buat Antarmuka.
public interface Pre<T,R> { R get(T item); }
Buat Metode Filter.
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; } }
Menggunakan Kode
public static class model { public String Name; } List<model> models = new ArrayList<>(); ... List<model> filtermodels = Filter(models,p-> p.Name.equals("filter"));
sumber