code: import static java.util.List.of;
  
  class GameOfLife {
  
     boolean[][] board = new boolean[3][3];
  
     GameOfLife() {}
  
     GameOfLife(String[] board) {
        set((i, j, s) -> board[i].charAt(j * 2) == '■');
     }
  
     void set(Setter setter) {
        for (int i = 0; i < board.length; i++) {
           for (int j = 0; j < board[i].length; j++) {
              board[i][j] = setter.set(i, j, board[i][j]);
           }
        }
     }
  
     void get(Getter getter) {
        set((i, j, s) -> {
           getter.get(i, j, s);
           return s;
        });
     }
  
     int countNeighbors(int i, int j) {
        var counter = new Getter() {
           int count;
  
           @Override
           public void get(int li, int lj, boolean state) {
              if (distance(i, j, li, lj) == 1 && board[li][lj])
                 count++;
           }
        };
        get(counter);
        return counter.count;
     }
  
     int distance(int i, int j, int li, int lj) {
        return Math.max(
             Math.abs(i - li),
             Math.abs(j - lj));
     }
  
     GameOfLife makeNextGeneration() {
        var n = new GameOfLife();
        n.set((i, j, s) -> {
           var alive = board[i][j];
           int c = countNeighbors(i, j);
           if (alive) {
              return c == 2 || c == 3;
           } else {
              return c == 3;
           }
        });
        return n;
     }
  
     void print() {
        get((i, j, s) -> {
           if (j == 0)
              System.out.println();
           System.out.print(s ? "■ " : "□ ");
        });
     }
  
     interface Setter {
        boolean set(int i, int j, boolean state);
     }
  
     interface Getter {
        void get(int i, int j, boolean state);
     }
  
     public static void main(String[] args) {
        String[] board = {
             "□ ■ □ ",
             "□ ■ □ ",
             "□ ■ □ ",
        };
        var gol = new GameOfLife(board);
        for (var generation : of(0, 1, 2)) {
           gol.print();
           System.out.println("\n");
           gol = gol.makeNextGeneration();
        }
     }
  
  }
  