1. Konversi Loop ke Stream
Tugas: Ubah loop tradisional berikut ke menggunakan Stream dan Lambda
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
for (Integer num : numbers) {
System.out.println(num * 2);
}
Contoh Output:
2
4
6
8
10
<details> <summary>Klik untuk melihat solusi</summary>
numbers.stream()
.map(num -> num * 2)
.forEach(System.out::println);
</details>
2. Filtering dengan Stream
Tugas: Gunakan Stream untuk menampilkan bilangan genap dari list di bawah:
List<Integer> numbers = Arrays.asList(12, 5, 7, 18, 24, 3);
Contoh Output:
12, 18, 24
<details> <summary>Solusi</summary>
numbers.stream()
.filter(n -> n % 2 == 0)
.forEach(n -> System.out.print(n + " "));
</details>
3. Sorting dengan Lambda
Tugas: Urutkan list string berikut secara case-insensitive:
List<String> names = Arrays.asList("Alice", "bob", "Charlie", "dave");
Contoh Output:
Alice, bob, Charlie, dave
<details> <summary>Solusi</summary>
names.stream()
.sorted((s1, s2) -> s1.compareToIgnoreCase(s2))
.forEach(name -> System.out.print(name + " "));
</details>
4. Operasi map
dan reduce
Tugas: Hitung total harga setelah pajak 10% dari list harga berikut:
List<Double> prices = Arrays.asList(100.0, 200.0, 50.0);
Contoh Output:
385.0 // (100*1.1 + 200*1.1 + 50*1.1)
<details> <summary>Solusi</summary>
double total = prices.stream()
.map(price -> price * 1.1)
.reduce(0.0, Double::sum);
System.out.println(total);
</details>
5. Kolektor (Collectors
)
Tugas: Kelompokkan kata-kata berikut berdasarkan panjangnya:
List<String> words = Arrays.asList("apple", "banana", "kiwi", "grape");
Contoh Output:
4: [kiwi]
5: [apple, grape]
6: [banana]
<details> <summary>Solusi</summary>
Map<Integer, List<String>> grouped = words.stream()
.collect(Collectors.groupingBy(String::length));
grouped.forEach((len, list) ->
System.out.println(len + ": " + list)
);
</details>
6. Predicate dan Method Reference
Tugas: Cek apakah semua angka dalam list adalah positif:
List<Integer> numbers = Arrays.asList(5, -3, 10, 8);
Contoh Output:
false
<details> <summary>Solusi</summary>
boolean allPositive = numbers.stream()
.allMatch(n -> n > 0);
System.out.println(allPositive);
</details>
7. Objek Kompleks dengan Stream
Tugas: Diberikan class Product
:
class Product {
String name;
double price;
// constructor, getter
}
Hitung:
- Total harga semua produk
- Produk termahal
- Rata-rata harga
Contoh Input:
List<Product> products = Arrays.asList(
new Product("Laptop", 1000),
new Product("Mouse", 50),
new Product("Keyboard", 150)
);
Contoh Output:
Total: 1200.0
Termahal: Laptop (1000.0)
Rata-rata: 400.0
<details> <summary>Solusi</summary>
// Total
double total = products.stream()
.mapToDouble(Product::getPrice)
.sum();
// Termahal
Product mostExpensive = products.stream()
.max(Comparator.comparingDouble(Product::getPrice))
.orElse(null);
// Rata-rata
double avg = products.stream()
.mapToDouble(Product::getPrice)
.average()
.orElse(0.0);
</details>
8. Tantangan: Gabungkan Operasi
Tugas: Dari list angka, tampilkan angka unik yang lebih besar dari 10, diurutkan dari terkecil ke terbesar:
List<Integer> numbers = Arrays.asList(5, 15, 3, 15, 7, 20);
Contoh Output:
15, 20
<details> <summary>Solusi</summary>
numbers.stream()
.filter(n -> n > 10)
.distinct()
.sorted()
.forEach(n -> System.out.print(n + " "));
</details>
Tips Belajar:
- Pahami dulu konsep dasar Lambda:
- Bentuk:
(parameter) -> { body }
- Contoh:
(a, b) -> a + b
- Bentuk:
- Pelajari urutan operasi Stream:
- Sumber (contoh:
list.stream()
) - Operasi antara (contoh:
filter
,map
,sorted
) - Operasi terminal (contoh:
forEach
,collect
,reduce
)
- Sumber (contoh:
- Coba eksplorasi method:
flatMap
,peek
,limit
,skip
Semangat belajar! 😊 Coba implementasikan solusi tanpa melihat jawaban terlebih dahulu, lalu bandingkan dengan solusi yang diberikan.