重要点 :看注释

从access.log中统计数据

  1. 对healthcheck.html的请求不计入统计
  2. 输出请求总量,以及GET和POST分别的总量
  3. 输出请求最频繁的10个接口及其次数,按次数降序
  4. 输出每个小时有多少分钟请求数超过400次, 比如12点有30分钟每分钟超过了400次,11点有35分钟每分钟超过了400次
public class stream {
public static void main(String[] args) {
//获取资源文件夹路径
String path = stream.class.getResource("/").getPath() + "access.log";
File file = new File(path);
try {
List<String> lines = Files.readLines(file, Charsets.UTF_8);
Collection<String> collection = Collections2.filter(lines, x -> !x.contains("healthcheck.html"));
System.out.println("请求总量:" + collection.stream().count());
//lambda 如果需要多个语句用大括号
System.out.println("GET请求量:" + collection.stream().filter((String x) -> {
return x.contains("GET");
}).count()); System.out.println("POST请求量:" + collection.stream().filter(x -> x.contains("POST")).count());
//这里用stream.flatMap和map 结果是一样的 因为没有涉及到逗号,俩者都是用来进行文本格式转换
// 除此之外 flatMap需要用Stream.of转换一下 map不需要
// 下面业务就是提取 提交链接
List<String> newlines = lines.stream().flatMap(line -> Stream.of(line.substring(line.indexOf(" /") + 1))).
flatMap(line -> Stream.of(line.substring(0, line.indexOf(" ")))).
filter(word -> word.length() > 0).
collect(Collectors.toList()); List<String> finallines = new ArrayList<String>();
for (String line : newlines) {
if (line.contains("?")) {
finallines.add(line.substring(0, line.indexOf("?")));
} else {
finallines.add(line);
}
} /* Collectors.groupingBy(Function.identity(), Collectors.counting())是用来分组的,
分组函数第一个参数 如下面是代表每一行line内容,后面是计数,因为list可能会有重复内容,按照line内容
分组并记下重复次数转换到对应Map的key和value */
Map<String, Long> map = finallines.stream().
collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); /* 下面是sorted排序 其中 comparingByValue() 是按照map中value升序排序 如果是comparingByKey()
则按照key升序排序 reversed是反过来 也就是变成降序, skip(1) 是跳过第一条数据,limit(10) 取10条数据
forEachOrdered 按照顺序输出 */
Map<String, Long> sortMap = new LinkedHashMap<>();
map.entrySet().stream().sorted(Map.Entry.<String, Long>comparingByValue().reversed()).skip(1).limit(10).
forEachOrdered(e -> sortMap.put(e.getKey(), e.getValue())); for (String key : sortMap.keySet()) {
System.out.println(key + " " + sortMap.get(key));
} Table<String, String, Integer> table = HashBasedTable.create(); Iterator iter = collection.iterator(); while (iter.hasNext()) {
String line = (String) iter.next();
line = line.substring(line.indexOf(":") + 1);
line = line.substring(0, line.indexOf(" +"));
String hour = line.substring(0, 2);
String minute = line.substring(3, 5); if (table.contains(hour, minute)) {
int count = table.get(hour, minute);
table.put(hour, minute, count + 1);
} else {
table.put(hour, minute, 1);
} } Iterator celliter = table.cellSet().iterator();
Map<String, Integer> countMap = new HashMap<>();
while (celliter.hasNext()) {
Table.Cell<String, String, Integer> cell = (Table.Cell<String, String, Integer>) celliter.next();
if (cell.getValue() > 400) {
if (countMap.containsKey(cell.getRowKey())) {
Integer count = countMap.get(cell.getRowKey()) + 1;
countMap.put(cell.getRowKey(), count);
} else
countMap.put(cell.getRowKey(), 1);
}
} for (String key : countMap.keySet()) {
System.out.println(key + "点有" + countMap.get(key) + "分钟每分钟超过了400次");
} } catch (IOException e) {
e.printStackTrace();
} }
}

Guava实现 过滤文本,排序,转换内容,分组计数转换map 等等的更多相关文章

  1. 在ASP.NET MVC5中实现具有服务器端过滤、排序和分页的GridView

    背景 在前一篇文章<[初学者指南]在ASP.NET MVC 5中创建GridView>中,我们学习了如何在 ASP.NET MVC 中实现 GridView,类似于 ASP.NET web ...

  2. MixItUp:超炫!基于 CSS3 & jQuery 的过滤和排序插件

    MixItUp 是一款轻量,但功能强大的 jQuery 插件,提供了对分类和有序内容的美丽的动画过滤和排序功能.特别适合用于作品集网站,画廊,图片博客以及任何的分类或有序内容. 它是如何工作的? Mi ...

  3. [转]在ASP.NET MVC5中实现具有服务器端过滤、排序和分页的GridView

    本文转自:http://www.cnblogs.com/powertoolsteam/p/MVC5_GridView_2.html 背景 在前一篇文章<[初学者指南]在ASP.NET MVC 5 ...

  4. Oracle Day2 过滤、排序、单行函数

    1.过滤和排序 SQL> --查询10号部门的所有员工信息 SQL> select * from emp ; 未选定行 SQL> ed SP2: 无法创建保存文件 "afi ...

  5. 《Entity Framework 6 Recipes》中文翻译系列 (27) ------ 第五章 加载实体和导航属性之关联实体过滤、排序、执行聚合操作

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-9  关联实体过滤和排序 问题 你有一实体的实例,你想加载应用了过滤和排序的相关 ...

  6. Oracle01——基本查询、过滤和排序、单行函数、多行函数和多表查询

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7272236.html Oracle的集群 Oracle的体系结构 SQL> --当 ...

  7. 使用 awk 过滤文本或文件中的字符串

    当我们在 Unix/Linux 下使用特定的命令从字符串或文件中读取或编辑文本时,我们经常需要过滤输出以得到感兴趣的部分.这时正则表达式就派上用场了. 什么是正则表达式? 正则表达式可以定义为代表若干 ...

  8. [Linux] day07——查看及过滤文本

    查看及过滤文本 =====================================cat      concatenate         -n 添加行号------------------- ...

  9. django-rest-framework 基础四 过滤、排序、分页、异常处理

    django-rest-framework 基础四 过滤.排序.分页.异常处理 目录 django-rest-framework 基础四 过滤.排序.分页.异常处理 1. 过滤 1.1 内置过滤类 1 ...

随机推荐

  1. base64 base64urlsafe

    1. base64 不算是加密算法,只能说是一种转码.使用64 个可见的字符来代替 ASCII码 中的256 个字符. 2. ASCII码占用一个字节,可以有0-255共256个取值.前128个为常用 ...

  2. laravel 事务处理

    //開啟事務 DB::beginTransaction(); try { //賬號密碼同步到後台登錄表 $user = new \App\Models\User; $user->name = $ ...

  3. c/c++ int数组初始化/重置为0

    1.int数组其实初始化的时候默认就是全部为0 int a[1000];int a[1000] = {0}; 以上2种写法其实都可以 注意:int a[1000] = {0};这种方法如果想把整形数组 ...

  4. 自动化测试神器 之 python unittest 断言

    自动化测试的最后一步需要判断结果是否正确,而正确设置断言可以帮助判断测试用例的执行结果,从而提高自动化测试的效率,python unittest  提供了一个比较完整的断言方法.unittest框架测 ...

  5. operator笔记

    # operator.itemgetter(*items) # 获取item >>> from operator import itemgetter # list使用下标进行返回 & ...

  6. PHP破解wifi密码(wifi万能钥匙的接口)

    新建wifi.php,复制粘贴 <?php $bssid = $_POST["bssid"] ; $ssid = $_POST["ssid"] ; if ...

  7. linux环境下python的pdb调试方法

    一些常用指令: h(elp) [comman]  #打印可用指令及帮助信息 r(eturn)  #运行代码直到下一个断点或当前函数返回 b(reak) [[filename:]lineno | fun ...

  8. Excel技巧--图表添加平均线为指标

    如上图,如果在柱状图有一平均指标线,就能很直观地显示各柱状值是否高于或低于平均值这个指标. 添加方法: (1)为表格制作一个柱状图: 2.对图表点右键,菜单选择“更改图表类型”.对话框如下选择: 3. ...

  9. Sql Server Report Service 的部署问题(Reporting Service 2014為什麼不需要IIS就可以運行)

    http://www.cnblogs.com/syfblog/p/4651621.html Sql Server Report Service 的部署问题 近期在研究SSRS部署问题,因为以前也用到过 ...

  10. Micro QR 和QR码

    QRcode.com 什么是QR码 QR码的种类 如何导入 QR码的成功之路 常见问题解答 咨询 Language   Micro QR码 返回 QR码的种类 首页 二维码上只有一个定位图案,这就是M ...