Tingkatkan Operasi Negara Menggunakan Agregator Java Stream

 – Beragampengetahuan
6 mins read

Tingkatkan Operasi Negara Menggunakan Agregator Java Stream – Beragampengetahuan

Dalam proyek AngularPortFoliomgr, logika untuk menghitung perbedaan persentase antara penawaran saham adalah operasi negara karena membutuhkan akses ke kutipan sebelumnya.

Dengan Java 24, streaming Gatherers Sekarang sudah selesai dan memberikan cara yang bersih untuk menangani logika keadaan ini di aliran itu sendiri.

Ini menghilangkan kebutuhan akan solusi yang lebih lama, seperti menyatakan referensi nilai di luar aliran (mis. AtomicReference) dan perbarui secara internal, yang sering mengarah pada efek samping dan lebih sulit untuk mempertahankan kode.

Contents

Java Stream Gatherer

Gatherers Diperkenalkan untuk mengaktifkan operasi negara untuk beberapa item aliran. Untuk mendukung ini, Gatherer Langkah -langkah berikut mungkin termasuk:

  • Keadaan holding inisialisasi
  • Integrator untuk menjalankan logika dan mendorong hasilnya ke aliran
  • Hasil kombiner memproses beberapa aliran paralel
  • Lengkapi semua proyek streaming yang tersisa

Langkah -langkah ini memungkinkan operasi negara yang fleksibel di aliran. Asalkan Gatherers Ya windowFixed(...)yang mengambil ukuran jendela dan mempertahankan koleksi di inisialisasi. Integrator mengisi set sampai ukuran jendela tercapai, lalu mendorongnya ke hilir dan membersihkan. Kerapu mengirim ke koleksi penggabungan hilir pada saat kedatangan. Terminator memastikan bahwa barang -barang yang tersisa yang belum diisi dengan jendela lengkap masih dikirim.

Kasus Penggunaan Praktis windowFixed(...) adalah parameter batch SQL IN klausa, terutama database oracle yang menggunakan batasan IN Parameter klausa untuk 1000. Penggunaan layanan umpan news Gatherer Selesaikan masalah ini:

...
final var companyReports = companyReportsStream
  .gather(Gatherers.windowFixed(999)).toList();
final var symbols = companyReports.stream()
  .flatMap(myCompanyReports -> this.symbolRepository
    .findBySymbolIn(myCompanyReports.stream()
      .map(SymbolToCikWrapperDto.CompanySymbolDto::getTicker).toList())
...

Dengan mode ini, banyak operasi negara sekarang dapat diproses dalam aliran, meminimalkan kebutuhan untuk keadaan eksternal. Ini mengarah ke implementasi aliran yang lebih bersih dan menyediakan lebih banyak ruang untuk pengoptimal hotspot JVM untuk meningkatkan kinerja dengan menghilangkan efek samping.

Gunakan kasing untuk kolektor stream java

Gunakan kasing untuk aliran Gatherers Perubahan persentase antara harga penutupan kutipan saham sedang dihitung. Untuk menghitung perubahan, diperlukan kutipan sebelumnya. Itulah implementasi sebelum Java 24: Nilai -nilai sebelumnya harus disimpan dalam aliran. Pendekatan ini bergantung pada efek samping, yang membuat kode lebih sulit untuk bernalar dan kurang efisien.

Dan GatherersLogika negara ini sekarang dapat diimplementasikan dalam aliran, sehingga membuat kode lebih bersih lebih dioptimalkan.

private LinkedHashMap<LocalDate, BigDecimal> calcClosePercentages(
  List<DailyQuote> portfolioQuotes, final LocalDate cutOffDate) {
  record DateToCloseAdjPercent(LocalDate localDate, 
    BigDecimal closeAdjPercent) { }
  final var lastValue = new AtomicReference<BigDecimal>(
    new BigDecimal(-1000L));
  final var closeAdjPercents = portfolioQuotes.stream()
    .filter(myQuote -> cutOffDate.isAfter(
      myQuote.getLocalDay()))
    .map(myQuote -> {
      var result = new BigDecimal(-1000L);
      if (lastValue.get().longValue() > -900L) {
        result = myQuote.getAdjClose()
          .divide(lastValue.get(), 25, RoundingMode.HALF_EVEN)
          .multiply(new BigDecimal(100L));
      }
      lastValue.set(myQuote.getAdjClose());
      return new DateToCloseAdjPercent(myQuote.getLocalDay(), result);
    })	
    .sorted((a, b) -> a.localDate().compareTo(b.localDate()))
    .filter(myValue -> 
      myValue.closeAdjPercent().longValue() < -900L)
    .collect(Collectors.toMap(DateToCloseAdjPercent::localDate, 
      DateToCloseAdjPercent::closeAdjPercent, 
      (x, y) -> y, LinkedHashMap::new));
    return closeAdjPercents;
}

ini lastValue Disimpan di luar sungai AtomicReference. Itu diinisialisasi -1000karena tidak ada kutipan negatif – produksi -100 Nilai aktual serendah mungkin. Ini memastikan bahwa nilai awal disaring sebelum kutipan dikumpulkan, menggunakan filter yang tidak termasuk perbedaan persentase kurang dari kurang dari -900.

Implementasi Java 24 Gatherers Dalam portofoliostatistik sepertinya ini:

private LinkedHashMap<LocalDate, BigDecimal> calcClosePercentages(
  List<DailyQuote> portfolioQuotes,final LocalDate cutOffDate) {
  final var closeAdjPercents = portfolioQuotes.stream()
    .filter(myQuote -> cutOffDate.isAfter(myQuote.getLocalDay()))
    .gather(calcClosePercentage())
    .sorted((a, b) -> a.localDate().compareTo(b.localDate()))
    .collect(Collectors.toMap(DateToCloseAdjPercent::localDate,
      DateToCloseAdjPercent::closeAdjPercent, 
      (x, y) -> y, LinkedHashMap::new));
    return closeAdjPercents;
}

private static Gatherer<DailyQuote, AtomicReference<BigDecimal>, 
  DateToCloseAdjPercent> calcClosePercentage() {
  return Gatherer.ofSequential(
    // Initializer
    () -> new AtomicReference<>(new BigDecimal(-1000L)),
    // Integrator
    (state, element, downstream) -> {
      var result = true;
      if (state.get().longValue() > -900L) {
        var resultPercetage = element.getAdjClose()
          .divide(state.get(), 25, RoundingMode.HALF_EVEN)
	  .multiply(new BigDecimal(100L));
	result = downstream.push(new DateToCloseAdjPercent(
          element.getLocalDay(), resultPercetage));
      }
      state.set(element.getAdjClose());
      return result;
    });	
}

Dalam metode ini calcClosePercentages(...),Catatan DateToCloseAdjPercent(...) Ini telah dipindahkan ke tingkat kelas karena digunakan dalam kedua metode. Operator peta telah diganti .gather(calcClosePercentage(...)). Filter dengan perbedaan persentase lebih kecil dari -900 Bisa dihapus karena Gatherer.

Dalam metode ini calcClosePercentage(...)ini Gatherer Bergantung pada Gatherer.ofSequential(...) Karena perhitungan hanya berlaku untuk kutipan berurutan yang dipesan.

Pertama, buat nilai awal vendor awal BigDecimal(1000L). Kedua, integrator digunakan (state, element, downstream). Parameter status memiliki keadaan awal AtomicReference<>(new BigDecimal(-1000)) Ini digunakan untuk penutupan kutipan sebelumnya. ini element adalah kutipan saat ini yang digunakan dalam perhitungan. ini downstream adalah aliran yang mendorong hasilnya. Hasilnya adalah nilai boolean yang menunjukkan apakah aliran menerima lebih banyak nilai. Harus diatur ke true Atau hasilnya downstream.push(...)kecuali pengecualian yang tidak dapat diproses terjadi. ini downstream Parameter digunakan untuk mendorong DateToCloseAdjPercent Rekam ke streaming. Nilai yang tidak disaring secara efektif disaring. ini state Parameter diatur ke nilai penutupan kutipan arus berikutnya Gatherer Ditelepon. Hasilnya kemudian dikembalikan untuk memberi tahu aliran apakah ia menerima lebih banyak nilai.

sebagai kesimpulan

Ini hanyalah salah satu kasus penggunaan yang dapat ditingkatkan Gatherers. Menggunakan referensi nilai untuk melakukan operasi negara di aliran di luar aliran sangat umum dan tidak lagi dibutuhkan. Ini akan memungkinkan JVM untuk mengoptimalkan lebih efisien karena Gatherershot spot tidak harus berurusan dengan efek samping. Dan Gatherers API, Java mengisi celah dalam streaming API dan sekarang memberikan solusi elegan untuk kasus penggunaan pernyataan.

Java menyediakan pra-buatan Gatherers menyukai Gatherers.windowSliding(...) Dan Gatherers.windowFixed(...) Ini membantu menyelesaikan kasus penggunaan umum.

Alasan pembaruan Java 25 LTS adalah:

  • Masalah threading virtual dengan masalah fiksasi utas telah diatasi → skalabilitas yang lebih baik
  • Pemuatan dan tautan kelas awal → startup aplikasi yang lebih cepat untuk aplikasi besar
  • sungai kecil Gatherers → Kode pembersih, optimasi yang ditingkatkan (tidak ada efek samping)

rencana pengembangan website



metode pengembangan website

jelaskan beberapa rencana untuk pengembangan website, proses pengembangan website, kekuatan dan kelemahan bisnis pengembangan website
, jasa pengembangan website, tahap pengembangan website, biaya pengembangan website

#Tingkatkan #Operasi #Negara #Menggunakan #Agregator #Java #Stream

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *