Praktik Mandiri 8: Java Streams dan Lambda Expressions

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:

  1. Pahami dulu konsep dasar Lambda:
    • Bentuk: (parameter) -> { body }
    • Contoh: (a, b) -> a + b
  2. Pelajari urutan operasi Stream:
    • Sumber (contoh: list.stream())
    • Operasi antara (contoh: filtermapsorted)
    • Operasi terminal (contoh: forEachcollectreduce)
  3. Coba eksplorasi method:
    • flatMappeeklimitskip

Semangat belajar! 😊 Coba implementasikan solusi tanpa melihat jawaban terlebih dahulu, lalu bandingkan dengan solusi yang diberikan.