Do they have the POWER?
It seems that Tile is a key element in your game model.
On the other hand, a field like Tile.hasBeenSearched sounds something technical, not something that belongs to conceptual model.
You probably don't wake up in the morning thinking, "hm, it will be nice to give the Tile class a hasBeenSearched attribute". This field is an implementation detail of the flood-fill algorithm, and I don't think it fits well into Tile. It will be better to use a Set&lt;Tile&gt; searched.
This field could be encapsulated within a FloodFiller class,
that takes tilesForSort and returns a collection of tiles for which the caller can set isPowered to true.
The advantage of this approach will be that you can reuse FloodFiller for other purposes, say, to actually flood your city.



This call is a bit tedious, with the duplicated tile.getPosition():


powerFill(tile.getPosition().x, tile.getPosition().y);



It would be good to create a helper powerFill(tile.getPosition()) that forwards to powerFill(int, int).



The name isNotInsideGrid is a bit clumsy. How about isOutsideGrid ?



Perhaps something like this might work well:

public class FloodFill {
    interface World {
        Set&lt;Position&gt; getEligibleNeighbors(Position position);
    }

    interface Position {
    }

    public static Set&lt;Position&gt; floodFill(World world, Position start) {
        Set&lt;Position&gt; searched = new HashSet&lt;&gt;();
        floodFill(world, searched, start);
        return searched;
    }

    private static void floodFill(World world, Set&lt;Position&gt; searched, Position position) {

        if (searched.contains(position)) {
            return;
        }

        searched.add(position);

        for (Position neighbor : world.getEligibleNeighbors(position)) {
            floodFill(world, searched, neighbor);
        }
    }
}


The idea is:


It is the responsibility of the World implementation to return the valid neighbors of a position that are eligible for filling:


x +- 1, y +- 1, or whatever coordinate system you use
Excluding positions outside of the world's boundary
Excluding positions where zoneType.getLevel() &lt; 1
Any other custom logic you might need

The FloodFill class doesn't need to know anything else about the world, and doesn't need to know what "filling" really means


This gives you the flexibility to reuse the flood fill logic to other purposes, without polluting the rest of your game model with specific knowledge catering to the flood fill process.