informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Java 8 memperkenalkan banyak fitur baru, yang paling menonjol adalah ekspresi Lambda dan Stream API. Stream API menyediakan metode yang efisien dan ringkas untuk memproses pengumpulan data, menjadikan kode lebih ringkas dan jelas, serta memiliki keterbacaan dan pemeliharaan yang tinggi. Artikel ini akan mempelajari penggunaan Java Stream API, termasuk konsep dasar, operasi umum, pemrosesan paralel, kasus praktis, dan praktik terbaik.
Stream API adalah abstraksi yang diperkenalkan di Java 8 untuk memproses kumpulan data yang memungkinkan data diproses secara deklaratif (mirip dengan pernyataan SQL). Stream API menyediakan banyak operasi canggih yang dapat digunakan untuk memfilter, mengurutkan, memetakan, mengurangi, dan operasi lain pada koleksi, sehingga sangat menyederhanakan kode.
Stream API menyediakan berbagai cara untuk membuat Stream. Yang umum mencakup hal berikut:
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);
Stream.of
:Stream<String> stream = Stream.of("a", "b", "c");
Stream.generate
:Stream<Double> stream = Stream.generate(Math::random).limit(10);
Stream.iterate
:Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(10);
Operasi perantara digunakan untuk mengonversi Stream dan dievaluasi secara lambat. Operasi perantara yang umum mencakup hal berikut:
filter
: digunakan untuk memfilter elemen.Stream<String> stream = list.stream().filter(s -> s.startsWith("a"));
map
: Digunakan untuk memetakan setiap elemen ke hasil yang sesuai.Stream<String> stream = list.stream().map(String::toUpperCase);
flatMap
: Digunakan untuk mengonversi setiap elemen menjadi Aliran dan kemudian menggabungkannya menjadi satu Aliran.Stream<String> stream = list.stream().flatMap(s -> Stream.of(s.split("")));
distinct
: Digunakan untuk menghapus duplikat.Stream<String> stream = list.stream().distinct();
sorted
: digunakan untuk menyortir.Stream<String> stream = list.stream().sorted();
peek
: Digunakan untuk melihat setiap elemen selama pemrosesan.Stream<String> stream = list.stream().peek(System.out::println);
Operasi terminal digunakan untuk memulai penghitungan Aliran dan menghasilkan hasil Operasi terminal umum meliputi:
forEach
: Melakukan operasi pada setiap elemen.list.stream().forEach(System.out::println);
collect
: Mengonversi Stream ke bentuk lain.List<String> result = list.stream().collect(Collectors.toList());
reduce
: Mengurangi elemen dalam Aliran menjadi sebuah nilai.Optional<String> result = list.stream().reduce((s1, s2) -> s1 + s2);
toArray
:Konversi Aliran ke array.String[] array = list.stream().toArray(String[]::new);
count
: Menghitung jumlah elemen.long count = list.stream().count();
anyMatch
、allMatch
、noneMatch
: Digunakan untuk penilaian yang cocok.boolean anyMatch = list.stream().anyMatch(s -> s.startsWith("a"));
boolean allMatch = list.stream().allMatch(s -> s.startsWith("a"));
boolean noneMatch = list.stream().noneMatch(s -> s.startsWith("a"));
findFirst
、findAny
: Digunakan untuk mencari elemen.Optional<String> first = list.stream().findFirst();
Optional<String> any = list.stream().findAny();
menggunakansorted
Metode ini mengurutkan Aliran dan dapat meneruskan pembanding.
List<String> list = Arrays.asList("b", "c", "a");
List<String> sortedList = list.stream().sorted().collect(Collectors.toList());
// 逆序排序
List<String> sortedListDesc = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
menggunakanfilter
Metode untuk memfilter elemen di Stream.
List<String> list = Arrays.asList("a", "b", "c");
List<String> filteredList = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
menggunakanmap
Metode memetakan elemen dalam Aliran.
List<String> list = Arrays.asList("a", "b", "c");
List<String> mappedList = list.stream().map(String::toUpperCase).collect(Collectors.toList());
menggunakanreduce
Metode untuk mengurangi elemen di Stream.
List<String> list = Arrays.asList("a", "b", "c");
String result = list.stream().reduce("", (s1, s2) -> s1 + s2);
menggunakancollect
Metode mengonversi Aliran ke bentuk lain.
List<String> list = Arrays.asList("a", "b", "c");
List<String> collectedList = list.stream().collect(Collectors.toList());
Set<String> collectedSet = list.stream().collect(Collectors.toSet());
String joinedString = list.stream().collect(Collectors.joining(","));
Parallel Stream dapat memanfaatkan sepenuhnya keunggulan CPU multi-core untuk meningkatkan efisiensi pemrosesan data.bisa menggunakanparallelStream
Metode menciptakan Aliran paralel.
List<String> list = Arrays.asList("a", "b", "c");
List<String> parallelList = list.parallelStream().map(String::toUpperCase).collect(Collectors.toList());
Bisa juga digunakanparallel
Metode mengubah Aliran normal menjadi Aliran paralel.
List<String> list = Arrays.asList("a", "b", "c");
List<String> parallelList = list.stream().parallel().map(String::toUpperCase).collect(Collectors.toList());
Perlu dicatat bahwa Aliran paralel tidak selalu lebih cepat daripada Aliran serial, dan perlu diuji sesuai dengan situasi spesifik.
Diberikan kumpulan string, filter string yang panjangnya kurang dari 3 dan ubah string yang tersisa menjadi huruf besar.
List<String> list = Arrays.asList("a", "ab", "abc", "abcd");
List<String> result = list.stream()
.filter(s -> s.length() >= 3)
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(result); // 输出:[ABC, ABCD]
Diberikan sekumpulan bilangan bulat, hitung rata-rata semua bilangan bulat.
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
OptionalDouble average = list.stream()
.mapToInt(Integer::intValue)
.average();
average.ifPresent(System.out::println); // 输出:3.0
Menggunakan API Aliran
Baca konten file dan output ke konsol.
try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
Baca isi file dan hitung jumlah kemunculan setiap kata.
try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
Map<String, Long> wordCount = lines
.flatMap(line -> Arrays.stream(line.split("\W+")))
.collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting()));
wordCount.forEach((word, count) -> System.out.println(word + ": " + count));
} catch (IOException e) {
e.printStackTrace();
}
Katakanlah kita memiliki tabel databaseusers
, berisi bidangid
、name
Danage
. Kita bisa menggunakan Stream API untuk memproses hasil query.
List<User> users = queryDatabase();
List<String> names = users.stream()
.filter(user -> user.getAge() > 18)
.map(User::getName)
.collect(Collectors.toList());
System.out.println(names);
Collectors
Kelas ini menyediakan berbagai macam kolektor, dan Anda dapat memilih kolektor yang sesuai dengan kebutuhan spesifik.Setelah Aliran digunakan, Aliran tersebut tidak dapat digunakan lagi. Jika Anda perlu menggunakannya kembali, Anda dapat mempertimbangkan untuk mengubah Aliran menjadi koleksi sebelum menggunakannya.
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
stream.forEach(System.out::println);
stream.forEach(System.out::println); // 会抛出IllegalStateException
Aliran Paralel tidak selalu lebih cepat daripada Aliran serial dan perlu diuji berdasarkan kasus per kasus.bisa menggunakanForkJoinPool
Untuk mengoptimalkan kinerja Aliran paralel.
ForkJoinPool customThreadPool = new ForkJoinPool(4);
customThreadPool.submit(() ->
list.parallelStream().forEach(System.out::println)
).get();
Saat menggunakan Stream API untuk memproses data dalam jumlah besar, Anda perlu memperhatikan masalah kebocoran memori.bisa menggunakanclose
metode untuk menutup Aliran, atau gunakantry-with-resources
pernyataan secara otomatis menutup Stream.
try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
Artikel ini memperkenalkan penggunaan Java Stream API secara mendetail, termasuk operasi dasar, operasi lanjutan, pemrosesan paralel, kasus praktis, dan praktik terbaik. Dengan memanfaatkan Stream API secara rasional, pengembang dapat menyederhanakan kode, meningkatkan keterbacaan dan pemeliharaan kode, dan juga meningkatkan efisiensi pemrosesan data. Saya harap artikel ini bermanfaat bagi Anda dalam penggunaan Stream API dalam pengembangan Java.
Java Stream API adalah alat yang ampuh untuk memproses pengumpulan data melalui penggunaan berbagai operasi yang fleksibel, pemrosesan data yang efisien dan komputasi streaming dapat dicapai. Jika Anda belum pernah menggunakan Stream API, disarankan untuk mempelajari dan menguasai alat canggih ini sesegera mungkin dan menerapkannya pada proyek Anda untuk meningkatkan efisiensi pengembangan dan kualitas kode.