使用 Java 的 Stream API 可以显著简化集合操作和分组逻辑,使代码更简洁易读。以下是一些常见的场景及其示例代码:
1. 简单过滤和映射
假设有一个 Order
类,并希望筛选出特定机房的订单,然后获取这些订单的 SN(序列号)。
示例代码:
import java.util.List;
import java.util.stream.Collectors;
public class Order {
private String sn;
private String originalRoom;
private String targetRoom;
// getters and setters
}
public class OrderService {
public List<String> getSnByRoom(List<Order> orders, String room) {
return orders.stream()
.filter(order -> room.equals(order.getOriginalRoom()) || room.equals(order.getTargetRoom()))
.map(Order::getSn)
.collect(Collectors.toList());
}
}
2. 分组和统计
假设你希望根据原机房和目标机房分组订单,并统计每个分组的订单数量。
示例代码:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class OrderService {
public Map<String, Long> countOrdersByRoom(List<Order> orders) {
return orders.stream()
.collect(Collectors.groupingBy(
order -> order.getOriginalRoom() + "-" + order.getTargetRoom(),
Collectors.counting()
));
}
}
3. 多级分组
如果你需要进行多级分组,比如先按原机房分组,然后在每个组内按目标机房分组。
示例代码:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class OrderService {
public Map<String, Map<String, Long>> countOrdersByMultiLevelRoom(List<Order> orders) {
return orders.stream()
.collect(Collectors.groupingBy(
Order::getOriginalRoom,
Collectors.groupingBy(
Order::getTargetRoom,
Collectors.counting()
)
));
}
}
4. 分组后的进一步操作
在分组后对每个组的数据进行进一步的操作,比如获取每个分组内的订单列表。
示例代码:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class OrderService {
public Map<String, List<Order>> groupOrdersByRoom(List<Order> orders) {
return orders.stream()
.collect(Collectors.groupingBy(
order -> order.getOriginalRoom() + "-" + order.getTargetRoom()
));
}
}
5. 使用自定义收集器
如果你有更复杂的需求,可以使用自定义收集器来完成。假设你需要根据SN进行分组,然后统计每个分组的订单数量。
示例代码:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class OrderService {
public Map<String, Long> countOrdersBySn(List<Order> orders) {
return orders.stream()
.collect(Collectors.groupingBy(
Order::getSn,
Collectors.counting()
));
}
}
总结
通过使用 Java 的 Stream API,可以简化复杂的集合操作和分组逻辑,使代码更加简洁和易于维护。