Eu não sei se entendi direito o que o ":" faz no for dentro do forEach
public static void main(String[] args) throws SQLException {
try(Connection connection = new ConnectionFactory().recuperarConexao()){
CategoriaDAO categoriaDAO = new CategoriaDAO(connection);
List<Categoria> listaDeCategorias = categoriaDAO.listar();
listaDeCategorias.stream().forEach(categoria ->{
System.out.println(categoria.getNome());
try {
for(Produto produto : new ProdutoDAO(connection).buscar(categoria)) {
System.out.println(categoria.getNome() + " - " + produto.getNome());
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
}
}
}