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?
Parece que estás en busca de un mapeo de cada uno Num
a un solo Parcelle
en la forma de Map<String, Parcelle>
en lugar de una List
como en groupingBy
. Una forma es utilizar toMap
mientras 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));