JavaRush /Blog Jawa /Random-JV /Ngopi #108. 12 Panggunaan Umum Alur Jawa, Cara Evaluasi A...

Ngopi #108. 12 Panggunaan Umum Alur Jawa, Cara Evaluasi Alokasi Memori Objek ing Jawa

Diterbitake ing grup

12 Cara Umum Nggunakake Alur Jawa

Sumber: Dev.to Java Streams API pisanan muncul ing Java 8. Tujuane kanggo nyedhiyakake cara sing luwih kompak kanggo nindakake operasi umum ing koleksi obyek. Uga, Java Streams API bisa digunakake kanggo ngleksanakake algoritma rumit. Ing artikel iki, kita bakal ngomong babagan kasus panggunaan umum Java Streams. Ngopi #108.  12 Panggunaan Umum Alur Jawa, Cara Ngevaluasi Alokasi Memori Objek ing Jawa - 1Pisanan, ayo ngresiki sawetara dhasar:
  • stream () - nggawe stream saka koleksi.

  • ngumpulake () - ngumpulake stream menyang obyek. Objek bisa dadi koleksi, primitif, utawa kelas khusus.

  • Kolektor minangka kelas sing nyedhiyakake (akeh) cara statis kanggo ngumpulake aliran.

Saiki ayo goleki sawetara kasus panggunaan kanggo Aliran:

1. Nyaring

  • Digunakake kanggo mbusak nilai saka Koleksi adhedhasar kondisi.

  • Kanggo nyaring unsur koleksi adhedhasar kondisi, nggunakake cara Filter () . Mung unsur sing cocog disimpen.

Conto: mbusak kabeh nomer ganjil saka dhaptar.
List<Integer> evenNumbers = originalList.stream()
        .filter(n -> n % 2 == 0)
        .collect(Collectors.toList());

2. Preprocessing

  • Migunani nalika saben nilai ing koleksi kudu diganti.

  • peta () cara digunakake kanggo aplikasi fungsi kanggo saben unsur koleksi lan bali koleksi anyar nilai diwilang.

Contone, ayo ngowahi saben nilai menyang kothak.
List<Integer> squares = originalList.stream()
        .map(n -> n * n)
        .collect(Collectors.toList());

3. Konversi

  • Migunani nalika kita pengin ngowahi koleksi dadi koleksi liyane.

  • Ana sawetara cara kanggo entuk iki.

Kaya kasebut ing ndhuwur, kita bisa nggunakake peta () lan ngumpulake () cara kanggo ndandani koleksi menyang koleksi liyane.

Conto 1: Nggawe Peta saka Dhaptar.

Ngonversi dhaptar senar menyang peta senar lan dawa.
Map<String, Integer> wordLengths = words.stream()
        .collect(Collectors.toMap(
                word -> word,
                word -> word.length()));

Conto 2. Ngonversi dhaptar menyang set.

Iki minangka kasus panggunaan umum kanggo mbusak duplikat. Tambahan, yen kita pengin sijine unsur bali menyang dhaftar, kita bisa nggunakake stream () lan ngumpulake () cara kaping pindho . Contone, ayo ngowahi dhaptar senar dadi dhaptar senar unik:
// if we want to collect to a set
Set<String> uniqueWords = words.stream()
        .collect(Collectors.toSet());

// OR

// if we want to start and end as a list
List<String> uniqueWords = words.stream()
        .collect(Collectors.toSet()).stream().collect(Collectors.toList());

Tuladha 3. Ngonversi dhaptar produk dadi dhaptar jenenge. (Flattening - Alignment)

List<String> productNames = products.stream()
        .map(product -> product.getName())
        .collect(Collectors.toList());

4. Ngurangi

  • Ngurangi Koleksi menyang nilai siji.

  • Cara nyuda () digunakake kanggo aplikasi fungsi kanggo saben unsur koleksi lan bali Nilai siji.

Elinga yen wiwit ngurangi () cara ngasilake nilai siji, ora bisa digunakake kanggo bali Koleksi. Contone, kita nyimpulake kabeh nilai ing dhaptar:
int sum = numbers.stream()
        .reduce(0, (a, b) -> a + b);

5. Pengelompokan

  • Ngelompokake unsur Koleksi adhedhasar kondisi tartamtu.

  • Kanggo klompok unsur Koleksi miturut kondisi, nggunakake Collectors.groupingBy () cara .

Contone, ayo dikelompokake kabeh produk dadi dhaptar produk miturut kategorine.
Map<String, List<Product>> productsByCategory = products.stream()
        .collect(Collectors.groupingBy(product -> product.getCategory()));

6. Nggoleki

  • Nggoleki unsur Koleksi pisanan utawa sembarang sing cocog karo kondisi.

  • Metode findFirst () lan findAny () digunakake kanggo nggoleki .

Iki biasane padha karo telusuran linear. Contone, kita nggoleki tembung pisanan ing dhaptar, dawane ngluwihi 5 karakter.
Optional<String> firstLongWord = words.stream()
        .filter(word -> word.length() > 5)
        .findFirst();
// Note that findFirst() and findAny() methods return Optional<T> objects.

7. Ngurutake

  • Ngurutake unsur Koleksi.

  • Cara sorted () digunakake kanggo ngurutake .

Umumé, Collections.sort () cukup kanggo ngurutake koleksi. Kita bisa nggunakake diurutake () khusus yen kita pengin mbukak operasi liyane. Contone, ayo ngurutake dhaptar nomer ing urutan munggah banjur bali unsur k pisanan.
List<Integer> topK = numbers.stream()
        .sorted()
        .limit(k)
        .collect(Collectors.toList());

8. Pemisahan

  • Misahake unsur Koleksi adhedhasar kondisi tartamtu.

  • Cara Collectors.partitioningBy () digunakake kanggo misahake unsur .

Pisah iku padha karo klompok, kajaba sing ngasilake rong koleksi-siji kanggo unsur sing cocog karo kondisi lan siji kanggo unsur sing ora cocog karo kondisi. Contone, ayo dibagi siswa dadi sing lulus ujian lan sing gagal.
Map<Boolean, List<Student>> passingFailing = students
        .stream()
        .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));

9. Ngetang

  • Ngetung jumlah unsur sing cocog karo kondisi.

  • Cara count () digunakake kanggo ngetung jumlah unsur sing cocog karo kondisi .

Contone, ayo ngetung jumlah tembung ing dhaptar sing dawane ngluwihi 5 karakter.
long count = words.stream()
        .filter(word -> word.length() > 5)
        .count();

10. Jembar

  • Nggawe sawetara nilai.

  • Kanggo nggawe sawetara nilai, gunakake metode range() .

Ana kelas khusus kanggo nggawe aliran jinis tartamtu - IntStream , LongStream , DoubleStream lan Stream . Kelas kasebut migunani nalika nggarap jinis numerik primitif. Kanggo ngowahi array menyang stream, nggunakake Arrays.stream () . Contone, ayo nggawe array nomer saka 0 nganti 10.
int[] numbers = IntStream.range(0, 10).toArray();

11. Mathuk

  • Cocog karo unsur-unsur kumpulan kanthi predikat (kahanan).

  • Cara kayata anyMatch () , allMatch () , lan noneMatch () digunakake kanggo cocog unsur koleksi karo predikat lan ngasilake nilai boolean .

Contone, ayo mriksa produk kanthi rega luwih saka 10.
// true when all elements match the predicate
boolean allMatch = products.stream()
        .allMatch(product -> product.getPrice() > 10);

// true when any element matches the predicate
boolean anyMatch = products.stream()
        .anyMatch(product -> product.getPrice() > 10);

// true when no elements match the predicate
boolean noneMatch = products.stream()
        .noneMatch(product -> product.getPrice() > 10);

12. Nggabungake

  • Nggabungake unsur koleksi dadi senar.

  • Kanggo nggabungake unsur koleksi menyang senar, nggunakake cara Collectors.joining () .

Contone, ayo gabungke kabeh tembung ing dhaptar dadi siji string.
String joinedWords = words.stream()
        .collect(Collectors.joining(" "));
Iku mung kanggo skenario umum. Ana skenario liyane sing kurang umum sing bisa sampeyan jelajahi dhewe:
  • Aliran Paralel;
  • Statistik;
  • Kolektor Custom.

Keuntungan saka Utas

  • Kode luwih kompak-nyuda jumlah kode sing dibutuhake kanggo ngolah koleksi.

  • Kurang variabel penengah. Variabel intervening bisa nyebabake kesalahan. Sing luwih sithik, luwih gampang ngindhari kesalahan sing ora dikarepake.

  • Kode intuisi. Sawetara pangembang ora setuju yen benang luwih intuisi tinimbang cara liyane. Nanging, yen wis biasa, dheweke dadi luwih intuisi tinimbang cara liyane.

Matur nuwun kanggo maca. Muga-muga sampeyan seneng karo artikel iki. Ana akeh kasus liyane sing bisa digunakake benang sing ora dibahas ing topik iki. Bebas bae kanggo nambah skenario umum sing aku ora kejawab.

Carane ngevaluasi alokasi memori obyek ing Jawa

Sumber: DZone Artikel iki nuduhake telung cara paling kondhang kanggo ngevaluasi alokasi memori obyek ing Jawa.

Assessment memori nggunakake Profiler

Cara paling gampang kanggo ngira-ngira memori sawetara obyek iku kanggo ndeleng langsung menyang memori JVM nggunakake profiler kayata Visual VM . Ngopi #108.  12 Panggunaan Umum Alur Jawa, Cara Ngevaluasi Alokasi Memori Objek ing Jawa - 2Masalah karo pendekatan iki sing kudu nyambung menyang JVM mlaku, kang bisa uga ora bisa kanggo lingkungan produksi amarga alasan keamanan.

Assessment memori nggunakake Instrumen

Cara liya kanggo ngira memori sing diparengake kanggo obyek tartamtu yaiku nggunakake Instrumen. Ing istilah prasaja, kita kudu nggawe kelas lan ngumpulake menyang JAR. Sawise nggawe JAR, kita kudu nglakokake JVM bebarengan karo JAR kasebut. Sampeyan bisa ngerteni luwih akeh babagan cara iki ing kene . Kakurangan ing kene yaiku perlu kanggo nambah file jar tartamtu menyang JVM, sing bisa uga ora ditrima kanggo produksi amarga keamanan utawa masalah sing gegandhengan.

Assessment memori nggunakake Library JOL

Minangka pilihan liyane, kita bisa nggunakake JOL Library . Iki minangka perpustakaan sing kuat banget sing bisa menehi perkiraan rinci babagan bobot obyek lan memori sing diwenehake dening conto obyek. Kanggo nggunakake perpustakaan, kita kudu nambah dependensi:
<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.16</version>
</dependency>
Sawise kita bisa nggunakake kaya iki:
out.println(GraphLayout.parseInstance(myObject).totalSize() / 1024000d + " MB")

ObjectSizeCalculator saka arsip Twitter

Repositori GitHub umum Twitter duwe kelas alat sing diarani ObjectSizeCalculator sing bisa ngira memori sing dialokasikan kanggo conto obyek tartamtu. Ora butuh akeh memori utawa wektu kanggo nggunakake. Proses evaluasi mbutuhake sawetara detik, sanajan kanggo obyek gedhe. Nggunakake kelas iki cukup prasaja:
ObjectSizeCalculator.getObjectSize(address)
Aku nyaranake cara iki, nanging elinga yen mung didhukung dening Java Hotspot, OpenJDK lan TwitterJDK.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION