Cómo agregar un único valor clave para Java 8 flujo existente?

lluvia de ideas:

Aquí es lo que hago para llenar mi mapa estático

public static final Map<String, FooBar> mapEnum = 

Arrays.stream(FooBarEnum.values())
            .collect(Collectors.toMap(e-> StringUtils.upperCase(e.name), e -> e));

Quiero añadir otro single clave-valor a este mapa.

mapEnum.put("xx", FooBar.A);

Aquí está la enumeración

public enum FooBar {
   A("a"), B("b"), C("c");
}

Mi mapa estático se parecerá a esto después de un mapa se construye

{"a":FooBar.A, "b": FooBar.B, "c": FooBar.C, "xx": Foobar.A}

¿Es posible incluir la llamada explícita puesta en Collectors.toMap()?

Samuel Philipp:

En realidad no veo la necesidad de utilizar corrientes de Java para eso. Sólo tiene que utilizar el staticbloque para inicializar mapEnumy putvalores adicionales en el mismo:

public static final Map<String, FooBar> mapEnum;

static {
    mapEnum = Arrays.stream(FooBar.values())
            .collect(Collectors.toMap(FooBar::getName, Function.identity()));
    mapEnum.put("xx", FooBar.A);
    // ...
}

Collectors.toMap(): No hay garantías en cuanto al tipo, la mutabilidad, serializabilidad, o hilos de seguridad de la {} @code Mapa devuelto.

Para garantizar la mutabilidad de la Mapque devuelve Collectors.toMap(), lo que puede utilizar Map.put()posteriormente utilizar mejor esta:

Arrays.stream(FooBar.values())
        .collect(Collectors.toMap(Function.identity(), Function.identity(), (a, b) -> a, HashMap::new));

Si realmente quiere usar Java arroyos puede utilizar esto:

public static final Map<String, FooBar> mapEnum = Stream.concat(
        Stream.of(FooBar.values()).map(e -> Map.entry(e.getName(), e)),
        Stream.of(Map.entry("xx", FooBar.A))
).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

O si también desea agregar todos los nombres al valor de enumeración en sí puede cambiar su clase como esta:

public static enum FooBar {
    A("a", "xx"), B("b"), C("c");

    private String[] names;

    FooBar(String... names) {
        this.names = names;
    }

    public String[] getNames() {
        return names;
    }
}

Y utilizar esto para crear el mapa:

public static final Map<String, FooBar> mapEnum = Stream.of(FooBar.values())
        .flatMap(e -> Arrays.stream(e.getNames()).map(n -> Map.entry(n, e)))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Antes de Java 9 utilizan new AbstractMap.SimpleEntry<>()en lugar de Map.entry(). Si necesita el mapa para ser uso ordenada LinkedHashMap::newcon Collectors.toMap().

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=332249&siteId=1
Recomendado
Clasificación