Sam*_*Sam 4 java concatenation java-8 java-stream
在我的程序中,我有一个植物列表,每个植物都有一个测量(String),day(int),camera(int)和replicate number(int).我通过使用过滤器获得了所有想要的植物清单:
List<Plant> selectPlants = allPlants.stream().filter(plant -> passesFilters(plant, filters)).collect(Collectors.toList());
我现在想做的是让所有具有相同摄像头,测量值和重复值的植物.并按顺序组合它们.因此,如果我有1,2,3,5天,我想找到所有类似的植物并将值附加到getValues(函数)的一个植物中.
我向Plant添加了一个方法,它只使用addAll(新工厂值)来追加值.
有没有办法做到这一点,而不是一遍又一遍地遍历列表来找到类似的植物,然后每天按时间排序然后追加?对于这个问题的可怕措辞,我感到很遗憾.
虽然Vakh的答案是正确的,但这是不必要的复杂.
通常,实现自己的密钥类的工作不会得到回报.您可以使用a List作为键,这意味着由于装箱原始值而产生轻微的开销,但考虑到我们在这里执行像哈希这样的操作,它可以忽略不计.
并且不必使用for循环进行排序,更糟糕的是,使用循环进行排序Comparator.为什么我们有溪流和lambdas?你可以Comparator使用lambda 来实现(p1,p2) -> p1.getDay()-p2.getDay(),甚至更好Comparator.comparing(Plant::getDay).
此外,您可以一步完成整个操作.该sort步骤将创建一个有序流,并且收集器将维护遭遇顺序,因此您可以使用一个流进行排序和分组:
Map<List<?>, List<Plant>> groupedPlants =  allPlants.stream()
  .filter(plant -> passesFilters(plant, filters))
  .sorted(Comparator.comparing(Plant::getDay))
  .collect(Collectors.groupingBy(p ->
     Arrays.asList(p.getMeasurement(), p.getCamera(), p.getReplicateNumber())));
就这样.
| 归档时间: | 
 | 
| 查看次数: | 196 次 | 
| 最近记录: |