笔者平时时间有限,直接贴代码,关于几个接口的差别,可以查看这两篇文章

感受lambda之美,推荐收藏,需要时查阅

https://juejin.im/post/5ce66801e51d455d850d3a4a

Java8 函数式编程读书总结

https://juejin.im/entry/5912bbe0a0bb9f0058b485d6

<T> List<T> readList(Table table, OID[] oids, String[] fieldNames, Class clazz, List<T> defaultValue, Predicate<? super T> filter, Consumer<? super List<T>> consumer, UnaryOperator<? super T> operator);
 @Override
public <T> List<T> readList(Table table, OID[] oids, String[] fieldNames, Class clazz, List<T> defaultValue, Predicate<? super T> filter, Consumer<? super List<T>> consumer, UnaryOperator<? super T> operator) {
if (table == null || table.isEmpty()) {
return defaultValue;
} Class[] declaredFieldType = getDeclaredFieldType(fieldNames, clazz); if(ArrayUtils.isEmpty(fieldNames)||ArrayUtils.isEmpty(declaredFieldType))
{
log.error("字段名长度和字段数据类型长度不能为null");
throw new IllegalArgumentException("字段名长度和字段数据类型长度不能为null");
} if(!ArrayUtils.isSameLength(fieldNames, declaredFieldType))
{
throw new IllegalArgumentException("字段名个数与字段数据类型数组长度不一致");
} Map<OID, Table.Row> rowMapping = table.getMap(); if(MapUtils.isEmpty(rowMapping)) {
return defaultValue;
} log.debug("待查询oid名称:{}",String.join(",", fieldNames)); String [] oidInDottedString = Arrays.asList(oids).stream().map(OID::toDottedString).toArray(size->new String[size]); List<T> list = new LinkedList<T>(); for(Table.Row row : rowMapping.values()) { Set<OID> keys = row.getMap().keySet(); try {
T instance = (T)clazz.newInstance(); for (OID key : keys) {
String dotString = key.toDottedString(); for (int i = 0; i < oidInDottedString.length; i++) { String oidString = oidInDottedString[i]; if (dotString.contains(oidString)) { String fieldName = fieldNames[i]; Variable value = row.getVariable(key); Class declaredType = declaredFieldType[i]; setProperty(instance,declaredType,fieldName,value); }
}
} list.add(instance); }catch (IllegalAccessException|InstantiationException e)
{
log.error("提取属性失败:{}",e);
}
} if(operator != null && CollectionUtils.isNotEmpty(list)) {
list.stream().forEach(instance->{operator.apply(instance);});
} if(filter != null && CollectionUtils.isNotEmpty(list)) {
list = list.stream().filter(filter).collect(Collectors.toList());
} if(consumer != null && CollectionUtils.isNotEmpty(list)) {
consumer.accept(list);
} return list;
}
<T> T readObject(Table table, String[] fieldNames, Class clazz, T defaultValue,final Predicate<? super T> filter,final Consumer<? super T> consumer,final UnaryOperator<? super T> operator);

  @Override
public <T> T readObject(Table table, String[] fieldNames, Class clazz, T defaultValue, Predicate<? super T> filter, Consumer<? super T> consumer, UnaryOperator<? super T> operator) { if (table == null || table.isEmpty()) {
return defaultValue;
}
Optional<T> result = readList(table, fieldNames, clazz, Arrays.asList(defaultValue)/*, null, null, null*/).stream().findFirst(); return handleSingleObject(result,filter,consumer,operator);

用法:(方法签名会有出入,没有的签名方法,通过重载实现了,在此不贴出来代码,看官可自行实现,有疑问可跟帖留意交流)

//读取ip地址、子网掩码
Table ipAddrTable = snmpHelper.getTable(MIB.IpAddrTable); List<SnmpIfCard> ifCards = agentService.readList(ipAddrTable,
agentService.translateOID(SnmpObjectNotation.ipAddrEntry),
SnmpObjectNotation.ipFieldNames, SnmpIfCard.class,
null,
(SnmpIfCard ifCard) -> {
if(ifCard!=null) {
//过滤掉回环地址
String ifIpAddr = ifCard.getIfIpAddr();
return !"127.0.0.1".equals(ifIpAddr);
}
return false;
},(SnmpIfCard ifCard)->{
if(ifCard != null) {
//设置nodeId
ifCard.setNodeId(nodeId);
return ifCard;
}
return null;
}); //网口流量
Table ifTable = snmpHelper.getTable(MIB.IfTable);
agentService.readList(ifTable,SnmpObjectNotation.trafficFieldNames,SnmpIfCardTraffic.class,
null,
(SnmpIfCardTraffic traffic)->{
if(traffic != null) {
Integer ifIndex = traffic.getIfIndex();
//如果网口索引里没有这个IfIndex,则不采集(通常是过滤IfIndex =1的本地回环网卡 lo)
List<Integer> allIfIndex = ifCards.stream().map(SnmpIfCard::getIfIndex).collect(Collectors.toList());
return allIfIndex.contains(ifIndex);
}
return false;
},
captured::setTraffics,
(SnmpIfCardTraffic traffic)->{
if(traffic != null) {
//通过网口索引匹配,将对应网口索引的子网掩码和ip地址拷贝到网口流量信息实体上面
Optional<SnmpIfCard> matched = matchIfCard(ifCards, traffic);
if (matched.isPresent()) {
traffic.setNodeId(nodeId);
traffic.setIfIpNetMask(matched.get().getIfIpNetMask());
traffic.setIfIpAddr(matched.get().getIfIpAddr());
}
return traffic;
}
return null;
}); //文件系统使用情况
Table hrStorageEntry = snmpHelper.getTable(MIB.hrStorageEntry); agentService.readList(hrStorageEntry, SnmpObjectNotation.hrStorageEntryFields,
SnmpFileSystemUsage.class,null,
captured::setFsUsage,
(SnmpFileSystemUsage usage)->{
if(usage != null) {
usage.setNodeId(nodeId);
return usage;
}
return null;
});
  //内存使用率
Table memory = snmpHelper.getTable(MIB.memory);
agentService.readObject(memory, SnmpObjectNotation.memoryFieldNames, SnmpMemoryUsage.class,
(SnmpMemoryUsage) null,
captured::setMemoryUsage,
(usage) -> {
if(usage !=null) {
usage.setNodeId(nodeId);
return usage;
}
return null;
}); //系统运行状态,从这里获取cpu使用率信息
Table sysStats = snmpHelper.getTable(MIB.systemStats);
agentService.readObject(sysStats, SnmpObjectNotation.systemStatFields, SnmpCPUUsage.class,
(SnmpCPUUsage)null,
captured::setCpuUsage,
(usage) -> {
if(usage !=null) {
usage.setNodeId(nodeId);
return usage;
}
return null;
});

Function的应用

 <R,T> List<R> readTable(Table table, String[] fieldNames, Class clazz, Class[] declaredFieldType, List<T> defaultValue,
Predicate<? super T> filter, Consumer<? super List<T>> consumer, Function<? super T, ? extends R> mapper); @Override
public <R,T> List<R> readTable(Table table, String[] fieldNames, Class clazz, Class[] declaredFieldType, List<T> defaultValue,
Predicate<? super T> filter, Consumer<? super List<T>> consumer, Function<? super T, ? extends R> mapper)
{
List<T> list = readList(table, fieldNames, clazz, declaredFieldType, defaultValue, filter, consumer);
return list.stream().map(item -> {
R target = mapper.apply(item);
return target;
}).collect(Collectors.toList());
} @Override
public <T> List<T> readList(Table table, String[] fieldNames, Class clazz, Class[] declaredFieldType, List<T> defaultValue, Predicate<? super T> filter, Consumer<? super List<T>> consumer) {
return readList(table,fieldNames,clazz,declaredFieldType,defaultValue,filter,consumer,null);
}

JAVA8中Predicate,Consumer,UnaryOperator,Function接口的应用的更多相关文章

  1. java8中规范的四大函数式接口

    java8中规范的四大函数式接口: 1.Consumer<T>   :消费型接口    void accept(T t); 2.Supplier<T>      :供给型接口  ...

  2. [六] 函数式接口的复合方法示例 predicate 谓词逻辑运算 Function接口 组合运算 比较器 逆序 比较链

    复合的方法 有些函数式接口提供了允许复合的方法 也就是可以将Lambda表达式复合成为一个更加复杂的方法 之前的章节中有说到: 接口中的compose, andThen, and, or, negat ...

  3. 乐字节-Java8核心特性实战之函数式接口

    什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一 ...

  4. Java8新特性第2章(接口默认方法)

    在Java中一个接口一旦发布就已经被定型,除非我们能够一次性的更新所有该接口的实现,否者在接口的添加新方法将会破坏现有接口的实现.默认方法就是为了解决这一问题的,这样接口在发布之后依然能够继续演化. ...

  5. Java8常用的内置函数式接口(一)Predicate、Consumer、Supplier、Function

    Java8常用的内置函数式接口(一) 简介 JDK 1.8 API中包含了很多内置的函数式接口.有些是在以前版本的Java中大家耳熟能详的,例如Comparator接口,或者Runnable接口.对这 ...

  6. Function接口 – Java8中java.util.function包下的函数式接口

    Introduction to Functional Interfaces – A concept recreated in Java 8 Any java developer around the ...

  7. Spring8中lambda表达式的学习(Function接口、BiFunction接口、Consumer接口)

    代码重构,为了确保功能的等效性,梳理代码时,发现如下代码: public SingleRespTTO fundI(SingleReqTTO request) throws Exception { re ...

  8. java基础---->java8中的函数式接口

    这里面简单的讲一下java8中的函数式接口,Function.Consumer.Predicate和Supplier. 函数式接口例子 一.Function:接受参数,有返回参数 package co ...

  9. Java8新特性:Function接口和Lambda表达式参考

    Lambda基本:https://blog.csdn.net/wargon/article/details/80656575 https://www.cnblogs.com/hyyq/p/742566 ...

随机推荐

  1. [ZOJ 4025] King of Karaoke

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5766 求两个序列的相对元素的差出现次数最多的,最低出现一次. AC代 ...

  2. Vue-指令补充、过滤器、计数器属性、监听属性

    vue实例成员: el | template |data | methods watch 监听事件| computed 计数属性使用 | filters过滤器 | props 父传子 componen ...

  3. jsp模糊查询

    模板 查询之前: 查询之后: jsp的<script>: $(".inp2").click(function(){ var s=$(".inp"). ...

  4. 【Winform-自定义控件】一个自定义的进度条

    0.选择基类 public class MySlider : Control 1.设置控件的Style 在构造函数里添加: public MySlider() { //1.设置控件Style this ...

  5. [旧版] CASthesis 模板编译的问题

    写在前面的话:国科大最新版的模板在这里(https://github.com/mohuangrui/ucasthesis),利用它来写博后出站报告的相关介绍在这里: 本篇博文是针对另一个模板进行介绍的 ...

  6. jquery load() 方法 语法

    jquery load() 方法 语法 作用:当指定的元素(及子元素)已加载时,会发生 load() 事件.该事件适用于任何带有 URL 的元素(比如图像.脚本.框架.内联框架).根据不同的浏览器(F ...

  7. js 获取 touch length

    window.addEventListener("touchstart", touchHandler, false); function touchHandler(event){ ...

  8. delphi请求http接口中文乱码问题

    请求http接口的时候参数值是中文乱码: http接口一般都是由java,php以及C#开发而成的,乱码的原因也是由于编码的问题,一般传递数据的都是utf8,然后传递的时候都会urlEcode 那么d ...

  9. 4-EM算法原理及利用EM求解GMM参数过程

    1.极大似然估计 原理:假设在一个罐子中放着许多白球和黑球,并假定已经知道两种球的数目之比为1:3但是不知道那种颜色的球多.如果用放回抽样方法从罐中取5个球,观察结果为:黑.白.黑.黑.黑,估计取到黑 ...

  10. brute爆破

    0X01明文传输的表单爆破用户名和密码 不存在任何加密 直接爆破即可 当不存在用户名时: 当存在用户名时,密码错误: 这里由于靶场关了 所以我们用dvwa演示 但是dvwa没有以上的差别 所以我们默认 ...