在映射键集流上应用带有 anyMatch() 的谓词,并在谓词为假时返回一些结果
Applying a predicate with anyMatch() on a map keyset stream and returning some result when the predicate is false
我有一个 class Parcelle 具有三个属性 num 和 nature和 autre_nature。和 Parcelle listParcelles 列表。我正在体验 Java 8 条流,我想实现的是按 num 和 return 分组,Parcelle 都具有非空值 自然和autre_nature属性,否则只是return从组中随机抽取一个Parcelle。
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]]
为了分组,我使用了以下代码:
Map<String, List<Parcelle>> mapLignesParcelles = listParcelles.stream()
.collect(Collectors.groupingBy(lp->lp.getNum()+""));
但我不确定要使用什么来获得最终结果,我可以流式传输 mapLignesParcelles 键集,我想到了带有谓词 lp.getNature()!=null && lp.getAutre_Nature() !=null
的任何匹配,但是当谓词不成立时,如何向 return 任何元素表达事实?
stream
.filter(yourCondition)
.findFirst()
.orElse(randomlySelectedObject);
你有一个stream
,你根据你的条件过滤它,你尝试获取第一个符合条件的元素,如果找到你return它,否则你return randomlySelectedObject
.
您似乎在寻找每个 Num
到 Map<String, Parcelle>
形式的单个 Parcelle
的映射,而不是 groupingBy
中的 List
=].一种方法是在收集时使用 toMap
作为:
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));
分组前的另一种方式可以是:
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));
我有一个 class Parcelle 具有三个属性 num 和 nature和 autre_nature。和 Parcelle listParcelles 列表。我正在体验 Java 8 条流,我想实现的是按 num 和 return 分组,Parcelle 都具有非空值 自然和autre_nature属性,否则只是return从组中随机抽取一个Parcelle。
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]]
为了分组,我使用了以下代码:
Map<String, List<Parcelle>> mapLignesParcelles = listParcelles.stream()
.collect(Collectors.groupingBy(lp->lp.getNum()+""));
但我不确定要使用什么来获得最终结果,我可以流式传输 mapLignesParcelles 键集,我想到了带有谓词 lp.getNature()!=null && lp.getAutre_Nature() !=null
的任何匹配,但是当谓词不成立时,如何向 return 任何元素表达事实?
stream
.filter(yourCondition)
.findFirst()
.orElse(randomlySelectedObject);
你有一个stream
,你根据你的条件过滤它,你尝试获取第一个符合条件的元素,如果找到你return它,否则你return randomlySelectedObject
.
您似乎在寻找每个 Num
到 Map<String, Parcelle>
形式的单个 Parcelle
的映射,而不是 groupingBy
中的 List
=].一种方法是在收集时使用 toMap
作为:
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));
分组前的另一种方式可以是:
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));