import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

public class JejakElemen {

    static int elemenDilihat = 0;

    public static void main(String[] args) {
        List<Integer> data = List.of(3, 9, 12, 15, 21, 30);

        // findFirst: berhenti begitu elemen pertama yang lolos ditemukan
        elemenDilihat = 0;
        Optional<Integer> pertama = data.stream()
            .peek(n -> elemenDilihat++)
            .filter(n -> n % 4 == 0)
            .findFirst();
        System.out.println("findFirst = " + pertama + ", elemen dilihat: " + elemenDilihat);

        // anyMatch: berhenti di kecocokan pertama yang memenuhi predikat
        elemenDilihat = 0;
        boolean ada = data.stream()
            .peek(n -> elemenDilihat++)
            .anyMatch(n -> n > 20);
        System.out.println("anyMatch  = " + ada + ", elemen dilihat: " + elemenDilihat);

        // limit: memotong aliran setelah sejumlah elemen lolos
        elemenDilihat = 0;
        List<Integer> tiga = data.stream()
            .peek(n -> elemenDilihat++)
            .filter(n -> n % 3 == 0)
            .limit(3)
            .collect(Collectors.toList());
        System.out.println("limit 3   = " + tiga + ", elemen dilihat: " + elemenDilihat);

        // collect memproses seluruh elemen sampai habis
        elemenDilihat = 0;
        Long total = data.stream()
            .peek(n -> elemenDilihat++)
            .filter(n -> n % 3 == 0)
            .collect(Collectors.counting());
        System.out.println("counting  = " + total + ", elemen dilihat: " + elemenDilihat);
    }
}
