重要点 :看注释

从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. 5、Linux-Mac配置环境变量

    1.安装jdk1.6,1.7,1.8 2.查看jdk安装目录 /usr/libexec/java_home -v 1.6 /usr/libexec/java_home -v 1.7 /usr/libe ...

  2. Linux paste命令详解

    Linux paste命令 Linux paste命令用于合并文件的列.paste指令会把每个文件以列对列的方式,一列列地加以合并 将每个指定文件里的每一行整合到对应一行里写到标准输出,之间用制表符分 ...

  3. JDK官网下载教程

    进入官网网址 https://www.oracle.com/index.html  登录成功后,即可进行下载! PS:新版谷歌浏览器可能会出现无法下载的问题,使用IE浏览器即可.

  4. thinkPHP 3.2.3操作MongoDB指南

    今天使用thinkPHP操作MongoDB发现跟用MYSQL有很多不同的地方,在这里特别跟大家分享下. 暂时没用thinkPHP5一直还在用thinkPHP3.2.3觉得挺好用,MongoDB版本2和 ...

  5. jQuery实现商品详情 详细参数页面切换

    利用index实现: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  6. InfluxDB HTTP API reference

    InfluxDB HTTP API reference API地址:https://docs.influxdata.com/influxdb/v1.6/tools/api/ The InfluxDB ...

  7. webservice的model层命名空间不同的问题

        [XmlType(Namespace = "http://tempuri.org/MyClass4")]     [XmlRoot(Namespace = "ht ...

  8. intellij idea 设置 Error 提示颜色修改

    File--->Settings --->Editor --->ColorScheme--->General --->Errors and Warning--->E ...

  9. C++进阶--逻辑常数和比特位常数(Logical constness vs Bitwise constness)

    对于什么是const函数,有两种理解 Logical constness 实际的数据没有没修改,如下面程序中的vector v Bitwise constness 类的成员变量没有被修改,包括int ...

  10. TCP:WireShark分析,序列号Seq和确认号Ack

    转载自 http://blog.csdn.net/a19881029/article/details/38091243 序列号为当前端成功发送的数据位数,确认号为当前端成功接收的数据位数,SYN标志位 ...