Acoplar recursivamente valores de mapas anidados en Java 8

Dado unMap<String, Object>, donde los valores son unString u otroMap<String, Object>, ¿cómo podría uno, utilizando Java 8, aplanar los mapas a una sola lista de valores?

Ejemplo:

Map - "key1" -> "value1"
    - "key2" -> "value2"
    - "key3" -> Map - "key3.1" -> "value3.1"
                    - "key3.2" -> "value3.2"
                    - "key3.3" -> Map - "key3.3.1" -> "value3.3.1"
                                      - "key3.3.2" -> "value3.3.2" 

Para el ejemplo anterior, me gustaría la siguiente lista:

value1
value2
value3.1
value3.2
value3.3.1
value3.3.2

Sé que se puede hacer así:

public static void main(String args[]) throws Exception {
    //Map with nested maps with nested maps with nested maps with nested......
    Map<String, Object> map = getSomeMapWithNestedMaps();

    List<Object> values = new ArrayList<>();
    addToList(map, values);

    for (Object o:values) {
        System.out.println(o);
    }
}

static void addToList(Map<String, Object>map, List<Object> list) {
    for (Object o:map.values()) {
        if (o instanceof Map) {
            addToList((Map<String, Object>)o, list);
        } else {
            list.add(o);
        }
    }
}

¿Cómo puedo hacer esto con unStream?

Editar:

Después de jugar un poco, lo descubrí:

public static void main(String args[]) throws Exception {
    //Map with nested maps with nested maps with nested maps with nested......
    Map<String, Object> map = getSomeMapWithNestedMaps();
    //Recursively flatten maps and print out all values
    List<Object> list= flatten(map.values().stream()).collect(Collectors.toList());
}

static Stream<Object> flatten(Stream<Object> stream) {
    return stream.flatMap((o) ->
        (o instanceof Map) ? flatten(((Map<String, Object>)o).values().stream()) : Stream.of(o)
    );
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta