La aplicación de un predicado con AnyMatch () en un mapa de flujo de conjunto de claves y devolver algún resultado cuando el predicado es falsa

mounaim:

Tengo una clase Parcelle con tres atributos num y la naturaleza y autre_nature . y una lista de parcelle listParcelles . Estoy experimentando con Java 8 arroyos, y lo que me gustaría lograr es agrupar por num y devolver el Parcelle que tiene tanto nula no de la naturaleza y autre_nature atributos, de lo contrario sólo ida y vuelta Sólo Parcelle del grupo al azar.

Example :   
Input:   

    ligneParcelles[[num=1,nature=TC,autre_nature=TCC],  
                   [num=1,nature=TC,autre_nature=null],
                   [num=2,nature=TC,autre_nature=null],
                   [num=3,nature=TC,autre_nature=null],
                   [num=3,nature=Alpha,autre_nature=null],
                   [num=4,nature=TC,autre_nature=TC]
                   [num=4,nature=TC,autre_nature=null]]
Output :   
    ligneParcelles [[num=1,nature=TC,autre_nature=TCC],  
                   [num=2,nature=TC,autre_nature=null],
                   [num=3,nature=Alpha,autre_nature=null],
                   [num=4,nature=TC,autre_nature=TC]]

para agrupar utilicé el código siguiente:

Map<String, List<Parcelle>> mapLignesParcelles = listParcelles.stream()                                                    

          .collect(Collectors.groupingBy(lp->lp.getNum()+""));  

pero no estoy seguro de lo que debe usar con el fin de obtener el resultado final, que puede transmitir mapLignesParcelles conjunto de claves y pienso en AnyMatch con un predicado lp.getNature()!=null && lp.getAutre_Nature() !=null, pero ¿Cómo puedo expresar el hecho de volver a cualquier elemento cuando el predicado no se sostiene?

también:

Parece que estás en busca de un mapeo de cada uno Numa un solo Parcelleen la forma de Map<String, Parcelle>en lugar de una Listcomo en groupingBy. Una forma es utilizar toMapmientras la recogida:

Map<String, Parcelle> output = listParcelles.stream()
        .collect(Collectors.toMap(a -> a.getNum() + "", a -> a,
                (parcelle1, parcelle2) -> parcelle1.getNature() != null
                        && parcelle1.getAutre_nature() != null ? parcelle1 : parcelle2));

Otro de la manera delante de la agrupación podría ser como:

Map<String, Parcelle> output = mapLignesParcelles.entrySet().stream()
        .map(e -> new AbstractMap.SimpleEntry<>(e.getKey(), e.getValue()
                .stream()
                .filter(lp -> lp.getNature() != null && lp.getAutre_nature() != null)
                .findAny()
                .orElse(e.getValue().get(new Random().nextInt(e.getValue().size())))))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Supongo que te gusta

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