java - 按条件对列表进行分组,具体取决于其他列表
问题描述
当涉及到创建流的对象的属性时,流分组对我来说很清楚,但是如何按依赖于其他列表的条件对对象进行分组。下面是带有嵌套循环的代码,我想将其转换为流解决方案。
public class Main {
public static void main(String[] args) {
LocalDate n = LocalDate.from(LocalDate.now());
List<LocalDate> groupingDates = Arrays.asList(n, n.plusDays(10), n.plusDays(20));
List<Item> itemsToBeGrouped = Arrays.asList(
//should go to group labeled by "n"
new Item(n, n.plusDays(1)),
new Item(n.minusDays(5), n.plusDays(7)),
//should go to group labeled by "n.plusDays(10)"
new Item(n.plusDays(5), n.plusDays(11)),
//should go to group labeled by "n.plusDays(20)"
new Item(n.plusDays(15), n.plusDays(20)));
Map<LocalDate, List<Item>> groupedItems = new LinkedHashMap<>();
for(Item i : itemsToBeGrouped) {
for (LocalDate date : groupingDates) {
if(isActiveOnDate(i, date)) {
if (!groupedItems.containsKey(date)) {
groupedItems.put(date, new ArrayList<>());
}
groupedItems.get(date).add(i);
}
}
}
System.out.println(groupedItems);
}
static boolean isActiveOnDate(Item item, LocalDate date) {
return !item.start.isAfter(date) && !item.end.isBefore(date);
}
}
public class Item{
public LocalDate start;
public LocalDate end;
public Item(LocalDate start, LocalDate end) {
this.start = start;
this.end = end;
}
@Override
public String toString() {
return "Item{" +
"start=" + start +
", end=" + end +
'}';
}
}
解决方案
groupingBy
在lambda 中执行相同的操作,就像在 中一样for-loop
,选择项目匹配的第一个日期,然后将其用作键:
Map<LocalDate, List<Item>> groupedItems = itemsToBeGrouped.stream()
.collect(Collectors.groupingBy(i -> groupingDates.stream()
.filter(d -> isActiveOnDate(i, d))
.findFirst() // Optional<Date>
.get() // will throw if nothing matches
));
推荐阅读
- php - 获取存在于多行和两列MySql PHP中的团队的得分总和
- vue.js - NativeScript-vue 自定义开关不起作用
- reporting-services - SSRS Web 应用程序错误。有版本问题
- java - 返回按字母顺序排序的动物列表,其最后一个字母不以参数中列出的任何字母结尾
- c++ - 字符串声明问题 C++
- java - 我正在尝试从不同的 URL 获取数据,然后在后台加载
- error-handling - 串行连接中断时“在处理上述异常期间,发生另一个异常”的无限循环
- angular - Angular Reactive Form: ReadOnly - fieldset disabled 和 formgroup.disable 之间的区别?
- html - Jquery:在弹出窗口中形成
- node.js - 为什么 Docker Hub 上的节点映像没有列出 11.x 版本的映像?