import java.util.*;
/**
* @author hardneedl
*/
public class ScoreInputDemo {
interface FilteredAction <T,R> {
/**
* 判断是否接受
* @param t 输入的数值
* @return <code>true</code>表示接受; <code>false</code>表示拒绝
*/
boolean accept(T t);
/**
* 干活吧
* @param t 输入参数
*/
void perform(T t);
/**
* 取计算结果
* @return 结果
*/
R getResult();
}
public static void main(String... args) {
FilteredAction<Integer, List<Integer>> filteredAction = new FilteredAction<Integer, List<Integer>>() {
List<Integer> scores = new ArrayList<>(50);
public boolean accept(Integer t) {
return t > -1 && t < 101;
}
public void perform(Integer t) {
if(accept(t)){
scores.add(t);
}
}
public List<Integer> getResult() {
return new ArrayList<>(scores);
}
};
System.out.println("请输入分数(输入-1时,表示输入结束):");
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
while (i!=-1) {
filteredAction.perform(i);
i = scanner.nextInt();
}
List<Integer> scores = filteredAction.getResult();
System.out.printf("人数:%d\r\n", scores.size());
IntSummaryStatistics is = scores.stream().mapToInt(value -> value).summaryStatistics();
System.out.printf("最高分:%d\r\n",is.getMax());
System.out.printf("最低分:%d\r\n",is.getMin());
System.out.printf("平均分:%f\r\n",is.getAverage());
}
}
FilteredAction 这个类抽象了三个方面
1)录入分数的有效性判断
2)如何处置录入的分数
3)获取录入后的原始数据内容
使用java 8 的lambda 表达式来计算最大最小值,平均值(这种编程方式源代码简洁)