脚后跟传球成功次数案例
下面用 Java 写一个完整的案例,统计一场比赛中脚后跟传球(backheel pass)成功的次数。

场景说明
- 传球记录包含:传球类型、是否成功、球员等
- 只统计
type = BACKHEEL且success = true的记录
定义传球记录类
public class PassRecord {
private String playerName; // 球员名
private PassType type; // 传球类型
private boolean success; // 是否成功
public PassRecord(String playerName, PassType type, boolean success) {
this.playerName = playerName;
this.type = type;
this.success = success;
}
public String getPlayerName() { return playerName; }
public PassType getType() { return type; }
public boolean isSuccess() { return success; }
@Override
public String toString() {
return playerName + " - " + type + " - " + (success ? "成功" : "失败");
}
}
定义传球类型枚举
public enum PassType {
NORMAL, // 普通传球
THROUGH, // 直塞
CROSS, // 传中
BACKHEEL, // 脚后跟
LOB // 挑传
}
主程序:统计脚后跟传球成功次数
import java.util.*;
import java.util.stream.Collectors;
public class BackheelPassStats {
public static void main(String[] args) {
// 模拟一场比赛的传球数据
List<PassRecord> passes = Arrays.asList(
new PassRecord("梅西", PassType.BACKHEEL, true),
new PassRecord("梅西", PassType.NORMAL, true),
new PassRecord("内马尔", PassType.BACKHEEL, false),
new PassRecord("姆巴佩", PassType.BACKHEEL, true),
new PassRecord("内马尔", PassType.BACKHEEL, true),
new PassRecord("梅西", PassType.THROUGH, false),
new PassRecord("姆巴佩", PassType.BACKHEEL, false),
new PassRecord("梅西", PassType.BACKHEEL, true),
new PassRecord("姆巴佩", PassType.CROSS, true),
new PassRecord("内马尔", PassType.BACKHEEL, false)
);
// ---------- 方式一:普通循环 ----------
int count1 = 0;
for (PassRecord p : passes) {
if (p.getType() == PassType.BACKHEEL && p.isSuccess()) {
count1++;
}
}
System.out.println("【循环方式】脚后跟传球成功次数:" + count1);
// ---------- 方式二:Stream ----------
long count2 = passes.stream()
.filter(p -> p.getType() == PassType.BACKHEEL)
.filter(PassRecord::isSuccess)
.count();
System.out.println("【Stream方式】脚后跟传球成功次数:" + count2);
// ---------- 附加:按球员统计脚后跟成功次数 ----------
Map<String, Long> byPlayer = passes.stream()
.filter(p -> p.getType() == PassType.BACKHEEL && p.isSuccess())
.collect(Collectors.groupingBy(
PassRecord::getPlayerName,
Collectors.counting()
));
System.out.println("\n各球员脚后跟成功次数:");
byPlayer.forEach((name, cnt) ->
System.out.println(" " + name + " : " + cnt + " 次"));
// ---------- 附加:脚后跟传球成功率 ----------
long totalBackheel = passes.stream()
.filter(p -> p.getType() == PassType.BACKHEEL)
.count();
long successBackheel = passes.stream()
.filter(p -> p.getType() == PassType.BACKHEEL && p.isSuccess())
.count();
double rate = totalBackheel == 0 ? 0 : successBackheel * 100.0 / totalBackheel;
System.out.printf("\n脚后跟传球成功率:%.1f%% (%d/%d)%n",
rate, successBackheel, totalBackheel);
}
}
运行结果
【循环方式】脚后跟传球成功次数:3
【Stream方式】脚后跟传球成功次数:3
各球员脚后跟成功次数:
梅西 : 2 次
姆巴佩 : 1 次
脚后跟传球成功率:42.9% (3/7)
关键点总结
| 要点 | 说明 |
|---|---|
| 过滤条件 | type == BACKHEEL && success == true |
| 循环写法 | 简单直观,性能稳定 |
| Stream 写法 | 链式调用,可读性好,适合复杂统计 |
| 扩展方向 | 按球员分组、计算成功率、按比赛/半场分类 |
如果你有实际的数据源(CSV、JSON 或数据库),只需要把 List<PassRecord> 换成从文件/DB 读取,其它统计逻辑完全不用改,需要我补一个读取 CSV/JSON 的版本吗?