Can anyone Help me in understanding the below code snippet related to Java Stream?

    public static IntStream primes(int max){
        IntStream primes = IntStream.range(2, max);
        IntFunction<IntPredicate> sieve = n->i->i==n || i % n != 0;
        primes = primes.filter(sieve.apply(2));
        for(int i = 3; i * i <= max; i++){
            primes = primes.filter(sieve.apply(i));
        }
        return primes;
    }

I am not able to understand How sieve and prime is calculated here ?The expression n->i->i==n || i % n != 0; I am not able to understand.