当前位置: 首页 > 编程日记 > 正文

用泛型方法Java从实体中提取属性值,以及在泛型方法中的使用

   public <T> T getFieldValue(Object target, String fieldName, Class<T> typeName){try {Object fieldValue = FieldUtils.readField(target, fieldName, true);return (T)fieldValue;} catch (IllegalAccessException e) {log.error("出错:实体类{}没有{}类型的{}属性字段!",target.getClass(),typeName.getSimpleName(),fieldName);throw new RuntimeException(e);}}

用法1:

public Long getLongValue(Object target, String fieldName){return getFieldValue(target,fieldName,Long.class);}

以此类推,你也可以写出

    public LocalDateTime getLocalDateTimeValue(Object target, String fieldName){return getFieldValue(target,fieldName,LocalDateTime.class);}public String getStringValue(Object target, String fieldName){return getFieldValue(target,fieldName,String.class);}

笔者的一个用法是在泛型方法中提取实体的属性值,做进一步计算

    <R,T> 你的返回类型 processData(String label, String snapshotKey, Class<T> targetClass,Predicate<? super T> filter, final Function<? super T, ? extends R> mapper){if(filter == null){//如果没有指定过滤表达式,给一个默认值filter = (T entity)->{LocalDateTime createTime = cacheService.getFieldValue(entity, "createTime", LocalDateTime.class);return createTime.getMinute() % 10 == 0&&createTime.getSecond() ==0;};}Map<String,Object> resultMap = new HashMap<>();Optional<SnmpNode> node1 = nodeMapping.values().stream().findFirst();List<T> list = null;if(node1.isPresent()){String ipAddr1 = node1.get().getAddress();list = cacheService.getCachedList(snapshotKey, ipAddr1, targetClass);//服务器ipresultMap.put("legend", nodeMapping.values().stream().map(SnmpNode::getAddress).collect(Collectors.toList()));//批量格式时间MM-dd HH:mm:ss并封送到ListList<String> xAxis = list.stream().map(entity->cacheService.getFieldValue(entity,"createTime", LocalDateTime.class)).filter(localDateTime -> localDateTime.getMinute()%10==0 && localDateTime.getSecond() == 0).map(createTime -> createTime.format(DateTimeFormatter.ofPattern("MM-dd HH:mm"))).collect(Collectors.toList());//筛选后的样本大小int filteredSize = xAxis.size();//由于图表不能显示太多的数据,太多的就会被隐藏,因此只显示最近的20条数据xAxis = xAxis.stream().skip(filteredSize>=0?filteredSize-20:filteredSize).collect(Collectors.toList());resultMap.put("xAxis",xAxis);List<EChartSeries> series = new LinkedList<>();for(Map.Entry<Long,SnmpNode> entry: nodeMapping.entrySet()){SnmpNode node = entry.getValue();String ipAddr = node.getAddress();List<T> traffics = cacheService.getCachedList(snapshotKey, ipAddr, targetClass);List<R> data = traffics.stream().filter(filter).skip(filteredSize>=0?filteredSize-20:filteredSize).map(mapper).collect(Collectors.toList());EChartSeries chartSeries = new EChartSeries.Builder().withName(ipAddr).withStack(label).withType("line").withData((LinkedList<String>) new LinkedList<R>(data)).build();if(!CollectionUtils.isEmpty(data)) {series.add(chartSeries);}}resultMap.put("series",series);}return 你的返回类型;}
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.LinkedList;/**** //    name:'邮件营销',* //    type:'line',* //    stack: '内存使用率',* //    data:[120, 132, 101, 134, 90, 230, 210]*/
@Data
@NoArgsConstructor
public class EChartSeries {private String name;private String type;private String stack;private LinkedList<String> data;private EChartSeries(Builder builder) {setName(builder.name);setType(builder.type);setStack(builder.stack);setData(builder.data);}public static final class Builder {private String name;private String type;private String stack;private LinkedList<String> data;public Builder() {}public Builder(EChartSeries copy) {this.name = copy.getName();this.type = copy.getType();this.stack = copy.getStack();this.data = copy.getData();}public Builder withName(String name) {this.name = name;return this;}public Builder withType(String type) {this.type = type;return this;}public Builder withStack(String stack) {this.stack = stack;return this;}public Builder withData(LinkedList<String> data) {this.data = data;return this;}public EChartSeries build() {return new EChartSeries(this);}}
}

转载于:https://www.cnblogs.com/passedbylove/p/11207933.html

相关文章:

藤本植物和攀爬植物模型包 Globe Plants – Bundle 23 – Vines and Creepers 03 (3D Models)

藤本植物和攀爬植物模型包 Globe Plants – Bundle 23 – Vines and Creepers 03 (3D Models) 全球植物–第23束–藤本植物和攀缘植物03 (3D模型) 大小解压后&#xff1a;1.73G 云桥网络 平台huo取素材 这个捆绑包23包括15种3D藤本植物和攀缘植物&#xff0c;用于一般的景观…

蘑菇模拟器TV版 for Android,安卓NES模拟器TV版下载

NES Emulator TV精选了上千款经典的红白机小游戏&#xff0c;我们小时候玩过的经典游戏都能够在这里找到&#xff0c;每一款游戏在这里都能够分别存档&#xff0c;没有太多时间的上班族可以尝试一下&#xff0c;给玩家带来最好的游戏体验。软件简介NES模拟器精选上千款红白机游…

由Node.js事件驱动模型引发的思考

引言 近段时间听说了Node.js&#xff0c;很多文章表述这个事件驱动模型多么多么优秀&#xff0c;应用在服务器开发中有很大的优势&#xff0c;本身对此十分感性去&#xff0c;决定深入了解一下&#xff0c;由此也引发了一些对程序设计的思考&#xff0c;记录下来。 什么是Node.…

2022-2028年中国未硫化橡胶制品行业市场运行格局及未来前景展望报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国未硫化橡胶制品行业市场行业相关概述、中国未硫化橡胶制品行业市场行业运行环境、分析了中…

使用 TListView 控件(3)

为什么80%的码农都做不了架构师&#xff1f;>>> 本例效果图: 代码文件: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls;typeTForm1 class(TForm)ListView1: TListView;Button…

POJ 1038 Bugs Integrated Inc (复杂的状压DP)

\(POJ~1038~~*Bugs~Integrated~Inc:\) &#xff08;复杂的状压DP&#xff09; \(solution:\) 很纠结的一道题目&#xff0c;写了大半天&#xff0c;就想练练手&#xff0c;结果这手生的。其实根据之前那道炮兵阵地就不应该写的&#xff0c;但是总觉得自己的思路会好一些&#x…

Blender基础入门学习教程 Learning Blender from Scratch

Blender基础入门学习教程 Learning Blender from Scratch 流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:aac&#xff0c;48000 Hz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小:5.5 GB |时长:7h 28m 你会学到什么 云…

android 事件冒泡,Android事件分发

当用户触摸屏幕时&#xff0c;系统会对触摸事件做出相应的相应&#xff0c;这个事件会产生一个MotionEvent&#xff0c;系统根据一定的规则将其传递给View进行处理&#xff0c;这个过程就是事件分发机制了。事件的传递分为两个阶段&#xff0c;即捕获阶段和冒泡阶段。捕获阶段&…

sqlserver trigger

1 --2 -- Create database trigger template 3 --4 USE [EasyJobExTest]5 GO6 7 --判断触发器是否存在,存在则删除8 IF EXISTS(9 select top 1 t.name as trigger_name,a.name as table_name from sys.triggers t,sys.objects a 10 where Lower(a.name)section and t.paren…

jenkins+sonarqube流水线脚本模板

pipeline { //这个任务在哪个主机上运行 //agent any//将这个项目运行在slave上 agent { label node1 }//参数化构建,主要设定git_version变量的值 parameters { string(name: git_version, defaultValue: v1.1, description: 选择你要部署的tag??) }stages { //整个部署的任…

苹果手机在火车站被偷的状况下如何定位找回

苹果手机在火车站被偷的状况下如何定位找回。首先打开“itunes”&#xff0c;选择菜单栏的“文件”-“将文件添加到资料库”选择要做铃声的歌曲&#xff0c;单击“打开”歌曲会出现在“资料库”的“音乐”里右击歌曲&#xff0c;选择“显示简介”选择“选项”填上“起始时间”和…

Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender

Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender CGCookie——Blender纹理基…

14/10/校内测试{天天考,丧心病狂}

1&#xff0c; 给定平面上n个OIer和n台电脑&#xff0c;每个OIer只能水平向右和竖直向下&#xff0c;找到一台电脑写代码&#xff0c;其花费为OIer与电脑之间的曼哈顿距离(|x_i-x_j||y_i-y_j|)。求出使n个OIer均找到自己电脑的最小花费。 输入输出格式 Input/output 输入格式&a…

android 图标拖动不了,拖动式选项卡(仿android) 添加了上下拉刷新后,下拉即刷新,而不是滚动到顶后再刷新,同时还想问一下正在刷新的图标怎么移到选项卡下...

这是我的HTML代码.mui-control-content {background-color: white;min-height: 600px;}.mui-control-content .mui-loading {margin-top: 50px;}新闻音乐sport第一个选项卡子项-1第一个选项卡子项-2第一个选项卡子项-3第一个选项卡子项-4第一个选项卡子项-5第一个选项卡子项-6第…

2022-2028年中国卫星互联网产业深度调研及投资前景预测报告(全卷)

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国卫星互联网行业市场行业相关概述、中国卫星互联网行业市场行业运行环境、分析了中国卫星互…

Rhel6-heartbeat配置文档

系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 192.168.122.119 server19.example.com 192.168.122.25 server25.example.com 所需的包:heartbeat-3.0.4-1.el6.x86_64.rpm heartbeat-libs-3.0.4-1.el6.x86_64.rpm heartbeat-devel-3.0.4-1.el6.x86_64.rpm 以下…

Java getBytes字符集问题

今天工作中又一次遇到了java字符集问题&#xff0c;这次是由getBytes方法导致的。 以前的时候&#xff0c;曾经很多次的解决过java字符集以及乱码的问题&#xff0c;以为对这块很了解了&#xff0c;至到今天的又一次深入的学习&#xff0c;才发现以前的认识当中存在的问题&am…

Blender未来科幻武器全流程制作视频教程

Blender 2.9 建模、UV、创建PBR纹理、照明和渲染全面学习视频教程 时长17h 30m 1280X720 MP4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 大小&#xff1a;15.3G 含项目素材 Blender完成PBR艺术创作:科幻板条箱和炮塔 云桥网络 平台hu…

android fragmentpageradapter切换不更新,关于android:在FragmentPagerAdapter中更新当前片段...

我有一个带有标签指示器的viewPager。 ViewPager是带有FragmentPagerAdapter的setAdaper。我对FragmentPagerAdapter的内部工作原理了解甚少。我注意到即使邻居还不可见&#xff0c;邻居片段也会恢复(称为OnResume)。我将更新方法放在OnResume中&#xff0c;以为一旦片段是最新…

高级软件工程的第一次作业:回顾自己本科设计

本科毕业设计&#xff0c;是各位同学大学最后的一个成果&#xff0c;或是一个软件、或是一个游戏&#xff0c;但都体现了大家的辛勤和汗水。 在本课程学习之初&#xff0c;希望大家重拾个人之前的成果&#xff0c;并重新从软件工程的视角&#xff0c;探视设计中存在的不足&…

如何定位并优化慢查询Sql

根据慢日志定位慢查询SQL。 查询慢日志相关变量&#xff0c;并进行设置&#xff1a; 主要关注下述三个变量&#xff1a; long_query_time、show_query_log_file、show_query_log 慢查询sql会被记录到show_query_log_file 日志文件中。 show variables like %quer%; -- 查询…

介绍一个懒人创建springmvc项目的方法(二)

PS: 我是一个懒人,我懒得搭建项目连pom都不想去找,连web.xml都不想配置.所以就会想着找一些简便的办法,来适应我这种懒人. ---------------------------- 本人介绍的是用eclipse和sts插件创建springmvc项目,其他项目目前用不着,等用着的时候在研究吧. 前提: 1 eclipse已经配置好…

python之函数三装饰器

装饰器形成的过程 装饰器的作用&#xff1a;不想修改函数的调用方式&#xff0c;但是还想在原来的函数前后加功能 原则&#xff1a;开发封闭原则 开发&#xff1a;对扩展是开发的 封闭&#xff1a;对修改是封闭的 装饰器的固定模式 计算运行时间 1 import time2 # time.time()获…

Boom Library 93套影视游戏无损配乐音效素材合集包

Boom Library 93套影视游戏无损配乐音效素材合集包 素材压缩包大小共&#xff1a;851G 每个合集为独立压缩包 可选择性下载 云桥网络 平台获取合集包 01.BOOM Library Assault Weapons Bundle【枪战机枪音效】 02.BOOM Library Birds of Prey【猛禽类音效】 03.BOOM Librar…

将数据追加到html 表格中,将数据添加到数据表中

将数据添加到数据表中03/30/2017本文内容在创建 DataTable 并使用列和约束定义其结构之后&#xff0c;您可以将新的数据行添加到表中。 要添加新行&#xff0c;可将一个新变量声明为 DataRow 类型。 当调用方法时&#xff0c;将返回新的 DataRow 对象 NewRow 。 然后&#xff0…

WIN7源码安装Apache和PHP注意事项

安装注意事项。 你注意下下载PHP&#xff0c;Apache的网站&#xff0c;上面有提示要安装Visual C库的。 Apache2.4.4需要VC10库支持&#xff0c;Microsoft Visual C 2010 SP1 Redistributable Package (x64) PHP5.6需要VC11库支持&#xff0c;Visual C Redistributable for Vis…

2022-2028年中国卫星导航行业深度调研及投资前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国卫星导航行业市场行业相关概述、中国卫星导航行业市场行业运行环境、分析了中国卫星导航行…

TypeKit ,use online fonts

TypeKit ,use online fonts 相信做UI的同学们经常会碰到字体的取舍问题为了页面的兼容性经常要写像下面的 <style type"text/css">body {font-family: "dejavu sans mono",Arial,Georgia,serif;} </style> 如果想用比较美观的不常见的字体只能…

详解mybatis的insert,update,delete返回值

为什么要提数据的事呢,是因为据说这个save返回的就是插入的数据的条数。但是遗憾的是,我们的这个user怎么能没有id呢,没有id有怎么查,怎么删,怎么改。进来的是没有id的user,出去的是有id的user,真是太厉害了,没想到不仅把返回值改变了,连参数都发生了改变,真是太神奇了。keyProperty=“id” 这是id就是绑定的id,那我就疑惑了,这绑定的哪个id啊。这样一搞,如果插入成功的话返回的是1,如果不成功的话返回的是-1。我让你删id是222222的,我还没创建呢,看你怎么删。

Java--Iterator迭代器(集合的遍历)

在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,指向第一个元素,当第一次调用迭代器的next方法时,返回第一个元素,然后迭代器的索引会向后移动一位,指向第二个元素,当再次调用next方法时,返回第二个元素,然后迭代器的索引会再向后移动一位,指向第三个元素,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。