01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package functions.two;
interface Stream {
  int next();
}

class IntStream implements Stream {
  private int i = -1;
  public int next() {
    return ++i;
  }
}

interface Predicate{
  boolean evaluate(int j);
}

class FilteredStream implements Stream{
  private Stream it;
  private Predicate p;

  public FilteredStream(Stream it, Predicate p) {
    this.it = it;
    this.p =p;
  }

  public int next() {
    int i;
    do {
      i = it.next();
    } while (!p.evaluate(i));
    return i;
  }
}

class IsEven implements Predicate {
  public boolean evaluate(int j){
    return (j%2)== 0;
  }
}
class Main {
  public static void main (String[] args) {
    IntStream I = new IntStream();
    FilteredStream F = new FilteredStream(I, new IsEven());
    System.out.println(F.next());   // prints 0 on the screen
    System.out.println(F.next());   // prints 2 on the screen
    System.out.println(F.next());   // prints 4 on the screen
    System.out.println(F.next());   // prints 6 on the screen
    System.out.println(F.next());   // prints 8 on the screen

    IntStream J = new IntStream();
    J.next();                       // move forward one item in J
    FilteredStream G = new FilteredStream(J, new IsEven());
    System.out.println(G.next());   // prints 2 on the screen
    System.out.println(G.next());   // prints 4 on the screen
    System.out.println(G.next());   // prints 6 on the screen
    System.out.println(G.next());   // prints 8 on the screen

    IntStream K = new IntStream();
    class Div3 implements Predicate {
      public boolean evaluate(int n) { return (n%3) == 0; }
    }
    FilteredStream H = new FilteredStream(K, new Div3());
    System.out.println(H.next());   // prints 0 on the screen
    System.out.println(H.next());   // prints 3 on the screen
    System.out.println(H.next());   // prints 6 on the screen
    System.out.println(H.next());   // prints 9 on the screen
  }
}