docs: public HashMap<TopologyAPI.StreamId, List<Grouping>> getStreamConsumers() {
      if (this.streamConsumers == null) {
        this.streamConsumers = new HashMap<>();
  
        // First get a map of (TopologyAPI.StreamId -> TopologyAPI.StreamSchema)
        Map<TopologyAPI.StreamId, TopologyAPI.StreamSchema> streamToSchema =
            new HashMap<>();
  
        // Calculate spout's output stream
        for (TopologyAPI.Spout spout : this.getTopology().getSpoutsList()) {
          for (TopologyAPI.OutputStream outputStream : spout.getOutputsList()) {
            streamToSchema.put(outputStream.getStream(), outputStream.getSchema());
          }
        }
  
        // Calculate bolt's output stream
        for (TopologyAPI.Bolt bolt : this.getTopology().getBoltsList()) {
          for (TopologyAPI.OutputStream outputStream : bolt.getOutputsList()) {
            streamToSchema.put(outputStream.getStream(), outputStream.getSchema());
          }
        }
  
        // Only bolts could consume from input stream
        for (TopologyAPI.Bolt bolt : this.getTopology().getBoltsList()) {
          for (TopologyAPI.InputStream inputStream : bolt.getInputsList()) {
            TopologyAPI.StreamSchema schema = streamToSchema.get(inputStream.getStream());
  
            String componentName = bolt.getComp().getName();
  
            List<Integer> taskIds = this.getComponentToTaskIds().get(componentName);
  
            if (!this.streamConsumers.containsKey(inputStream.getStream())) {
              this.streamConsumers.put(inputStream.getStream(), new ArrayList<>());
            }
  
            this.streamConsumers.get(inputStream.getStream()).add(Grouping.create(
                inputStream.getGtype(),
                inputStream,
                schema,
                taskIds)
            );
          }
        }
      }
  
      return this.streamConsumers;
    }