1. Pengenalan
Dalam tutorial ringkas ini, kami akan menunjukkan pelbagai cara untuk mengira jumlah bilangan bulat, menggunakan Stream API .
Demi kesederhanaan, kami akan menggunakan bilangan bulat dalam contoh kami. Walau bagaimanapun, kami juga boleh menggunakan kaedah yang sama untuk jangka panjang dan beregu.
2. Menggunakan Stream.reduce ()
Stream.reduce () adalah operasi terminal yang melakukan pengurangan pada elemen aliran .
Ini menerapkan pengendali binari (penumpuk) untuk setiap elemen dalam aliran, di mana operan pertama adalah nilai pengembalian aplikasi sebelumnya, dan yang kedua adalah elemen aliran semasa.
Pada kaedah pertama menggunakan kaedah mengurangi () , fungsi akumulator adalah ungkapan lambda yang menambah dua nilai Integer dan mengembalikan nilai Integer :
List integers = Arrays.asList(1, 2, 3, 4, 5); Integer sum = integers.stream() .reduce(0, (a, b) -> a + b);
Dengan cara yang sama, kita dapat menggunakan metode Java yang sudah ada :
List integers = Arrays.asList(1, 2, 3, 4, 5); Integer sum = integers.stream() .reduce(0, Integer::sum);
Atau kita boleh menentukan dan menggunakan kaedah khusus kita:
public class ArithmeticUtils { public static int add(int a, int b) { return a + b; } }
Kemudian, kita dapat meneruskan fungsi ini sebagai parameter ke metode mengurangi () :
List integers = Arrays.asList(1, 2, 3, 4, 5); Integer sum = integers.stream() .reduce(0, ArithmeticUtils::add);
3. Menggunakan Stream.collect ()
Kaedah kedua untuk mengira jumlah senarai bilangan bulat adalah dengan menggunakan operasi terminal kumpulkan () :
List integers = Arrays.asList(1, 2, 3, 4, 5); Integer sum = integers.stream() .collect(Collectors.summingInt(Integer::intValue));
Begitu juga, kelas Collectors menyediakan kaedah summingLong () dan summingDouble () untuk mengira jumlah panjang dan ganda.
4. Menggunakan IntStream.sum ()
Stream API menyediakan kami operasi perantaraan mapToInt () , yang mengubah aliran kami ke objek IntStream .
Kaedah ini mengambil mapper sebagai parameter, yang digunakannya untuk melakukan penukaran, kemudian, kita dapat memanggil metode sum () untuk menghitung jumlah elemen aliran.
Mari lihat contoh ringkas bagaimana kita boleh menggunakannya:
List integers = Arrays.asList(1, 2, 3, 4, 5); Integer sum = integers.stream() .mapToInt(Integer::intValue) .sum();
Dengan cara yang sama, kita boleh menggunakan kaedah mapToLong () dan mapToDouble () untuk mengira jumlah panjang dan ganda masing-masing.
5. Menggunakan jumlah # Stream dengan Peta
Untuk mengira jumlah nilai a Peta struktur data, pertamanya kita mewujudkan aliran daripada nilai-nilai itu Map , maka kita memohon salah satu daripada kaedah yang kita gunakan sebelum ini.
Contohnya, dengan menggunakan IntStream.sum () :
Integer sum = map.values() .stream() .mapToInt(Integer::valueOf) .sum();
6. Menggunakan Stream # jumlah dengan Objek
Mari kita bayangkan bahawa kita mempunyai senarai objek dan kita mahu mengira jumlah semua nilai bidang tertentu objek ini.
Sebagai contoh:
public class Item { private int id; private Integer price; public Item(int id, Integer price) { this.id = id; this.price = price; } // Standard getters and setters }
Seterusnya, mari kita bayangkan bahawa kita ingin mengira jumlah harga semua item dari senarai berikut:
Item item1 = new Item(1, 10); Item item2 = new Item(2, 15); Item item3 = new Item(3, 25); Item item4 = new Item(4, 40); List items = Arrays.asList(item1, item2, item3, item4);
Dalam kes ini, untuk mengira jumlah wang yang dengan cara yang ditunjukkan dalam contoh-contoh sebelum ini, kita perlu untuk memanggil peta () kaedah untuk menukar strim kami ke dalam aliran integer .
Hasilnya, kita dapat menggunakan Stream.reduce (), Stream.collect (), dan IntStream.sum () untuk mengira jumlahnya:
Integer sum = items.stream() .map(x -> x.getPrice()) .reduce(0, ArithmeticUtils::add);
Integer sum = items.stream() .map(x -> x.getPrice()) .reduce(0, Integer::sum);
Integer sum = items.stream() .map(item -> item.getPrice()) .reduce(0, (a, b) -> a + b);
Integer sum = items.stream() .map(x -> x.getPrice()) .collect(Collectors.summingInt(Integer::intValue));
items.stream() .mapToInt(x -> x.getPrice()) .sum();
7. Menggunakan jumlah # Stream dengan Rentetan
Mari kita anggap bahawa kita mempunyai objek String yang mengandungi beberapa bilangan bulat.
Untuk mengira jumlah bilangan bulat ini, pertama-tama, kita perlu mengubah String itu menjadi Array , kemudian kita perlu menyaring unsur-unsur yang tidak bulat , dan akhirnya, mengubah unsur - unsur yang tersisa dari array itu menjadi angka.
Mari lihat semua langkah ini:
String string = "Item1 10 Item2 25 Item3 30 Item4 45"; Integer sum = Arrays.stream(string.split(" ")) .filter((s) -> s.matches("\\d+")) .mapToInt(Integer::valueOf) .sum();
8. Kesimpulannya
Dalam tutorial ini, kami melihat beberapa kaedah bagaimana mengira jumlah senarai bilangan bulat dengan menggunakan Stream API. Juga, kami menggunakan kaedah ini untuk menghitung jumlah nilai bidang tertentu dari senarai objek, jumlah nilai peta, dan juga angka dalam objek String yang diberikan .
Seperti biasa, kod lengkap boleh didapati di GitHub.