在JDK8--3中已经说过,使用lambda方法需要新增函数式接口,为了使用方便,JDK8已经提供了许多内置接口,总的归纳来说,有四大函数式接口。

/**
*
* java8 四大内置接口
*
* 1、消费性接口:Consumer<T>
* 默认方法:void accept(T t)
*
* 2、供给型接口:Supplier<T>
* 默认方法:T get()
*
* 3、函数型接口:Function<T, R>
* 默认方法:R apply(T t)
*
* 4、断言型接口:Predicate<T>
* 默认方法:boolean test(T t)
*/

1、消费型接口,Consumer<T>,默认方法:void accept(T t)

使用场景:传入一个参数,在方法内对参数做处理,不做返回。

demo需求:对一个double入参乘以5之后做输出

demo示例:

public void consumerMethod(double d, Consumer consumer){
consumer.accept(d);
} @Test
public void consumerTest(){
log.info("consumerTest输出============={}");
consumerMethod(, m -> log.info("{}*5={}", m, (double)m*));
}

测试结果:

2、供给型接口,Supplier<T>,默认方法:T get()

 使用场景:无入参,有返回

 demo场景:返回一个100以内随机整数的集合

 demo样例:

public List supplierMethod(int num, Supplier supplier){
List list = new ArrayList<>();
for (int i=;i< num;i++){
list.add(supplier.get());
}
return list;
} @Test
public void supplierTest(){
List<Integer> s = supplierMethod(,()-> (int)(Math.random()*));
log.info("supplierTest输出============={}",JSON.toJSONString(s));
}

测试结果:

3、函数型接口:Function<T, R>, 默认方法:R apply(T t)

使用场景:有入参,有出参

demo需求:对一个字符串进行切割,返回切割后的第一个字符串

demo样例:

public String functionMethod(String num, Function<String,String> function){
return function.apply(num);
} @Test
public void functionTest(){
String s = functionMethod("354sd654sdasd",(x)->x.split("s")[0]);
log.info("functionTest输出============={}",s);
}

demo输出:

4、断言型接口:Predicate<T>,默认方法:boolean test(T t)

使用场景:有入参,按照条件判断,返回boolean

demo需求:对一个字符串集合做判断,如果不包含指定字符串,就从集合中剔除

demo样例:

    public List<String> preticateMethod (List<String> list, Predicate<String> predicate){
Iterator iterator = list.iterator();
while (iterator.hasNext()){
if(!predicate.test((String) iterator.next())){
iterator.remove();
}
}
return list;
} @Test
public void preticateTest(){
List<String> list = new ArrayList<>();
list.add("");
list.add("");
list.add("adsfdf");
list.add("asfd");
list.add("ghgfhgfh");
list.add("54ads");
log.info("functionTest输出============={}", JSON.toJSONString(preticateMethod(list,(x)->x.contains("a"))));
}

  demo测试结果:

5、其实,上述4个内置接口是我们平时使用的比较多的内置接口,除了这四个接口外,JDK8还提供其他的子类以供使用

  以Function接口为例,需求可能不止一个入参,可能是多个入参,有的需求可能是我的入参指定必须是double,或者出参必须是duoble,针对不同的需求,JDK8都做了对应的内置函数,例如

* Function 的子接口
* BiFunction<T, U, R>
    R apply(T t, U u);
* UnaryOperator<T> extends Function<T, T>
* BinaryOperator<T> extends BiFunction<T,T,T>
* ToDoubleFunction<T>   
    double applyAsDouble(T value);
* ToDoubleBiFunction<T, U>
    double applyAsDouble(T t, U u);
* ToIntBiFunction<T, U>
    int applyAsInt(T t, U u);
* ToIntFunction<T>
    int applyAsInt(T value);
* ToLongBiFunction<T, U>
    long applyAsLong(T t, U u);
* ToLongFunction<T>
    long applyAsLong(T value);
* LongFunction<R>
    R apply(long value);

  上述只是举例说明JDK8针对不同的需求有不同的内置接口,并非全量的接口。

JDK8--04:内置接口的更多相关文章

  1. tornado内置接口调用顺序initialize\prepare...

    一. initialize方法 首先, 该方法是框架预留的一个初始化时加载自定义内容的钩子, 其会在http请求方法之前调用 二. prepare方法 预处理方法, 在执行对应的请求方法之前调用. h ...

  2. golang内置类型和内置函数

    golang内置类型和内置函数是不需要引入包直接可用的 golang内置类型: 数值类型 string int,unint float32,float64 bool array 有长度的 comple ...

  3. 【摸鱼神器】UCode Cms管理系统 内置超好用的代码生成器 解决多表连接痛点

    一.序言 UCode Cms管理系统是面向企业级应用软件开发的脚手架.当前版本1.3.4.快速体验: git clone https://gitee.com/decsa/demo-cms.git (一 ...

  4. JDK8新特性03 Lambda表达式03_Java8 内置的四大核心函数式接口

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.functio ...

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

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

  6. python 自动化之路 day 04.1 python内置函数

    总结一下内置函数,Build-in Function. 一.数学运算类 abs(x) 求绝对值 complex([real[, imag]]) 创建一个复数 divmod(a, b) 分别取商和余数注 ...

  7. 微信内置浏览器私有接口WeixinJSBridge介绍(转)

    这篇文章主要介绍了微信内置浏览器私有接口WeixinJSBridge介绍,本文讲解了发送给好友.分享函数.隐藏工具栏.隐藏三个点按钮等功能,需要的朋友可以参考下 微信网页进入,右上角有三个小点,没错, ...

  8. 微信内置浏览器私有接口WinXinJsBridge介绍

    关于微信内置浏览器私有接口WeiXinJsBridge,只是之前接触过的一个微信公众号项目中遇到过,不过并没有深入研究过,可以说并没有了解过... 刚好今天无意中看到了这方面的知识,就补习一下,弥补一 ...

  9. Java8内置的函数式编程接口应用场景和方式

    首先,我们先定义一个函数式编程接口 @FunctionalInterface public interface BooleanFunctionalInterface<T> { boolea ...

随机推荐

  1. Rocket - debug - TLDebugModuleInner - ABSTRACTAUTO

    https://mp.weixin.qq.com/s/adSB7lmKcqmwVd80-gmdIw 简单介绍TLDebugModuleInner中ABSTRACTAUTO寄存器的实现. 1. ABST ...

  2. 概念辨析-Description Language还是Description Library?

    https://mp.weixin.qq.com/s/p7eyD6GkniFGHrnr8t2SZQ   概念辨析-Description Language还是Description Library? ...

  3. 概念辨析-Hardware Description还是Hardware Developing?

    https://mp.weixin.qq.com/s/j4Ndo1R4Go9IaGbhE_nsTg   Verilog, standardized as IEEE 1364, is a hardwar ...

  4. js循环语句while,do..while,for

    1. while循环 while(循环条件){ 循环体语句块; } 2.do..while循环 do{ 循环体语句块; }while(循环条件) 两者区别:while先判断后执行.循环体语句可能一次都 ...

  5. MyBatis(一) 概述与SQL定制、对象映射

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.MyBatis概述 1.mybatis简介 MyBatis 是支持定制化 SQL.存储过程以及高级映 ...

  6. 移动端border:1px问题解决方案

    了解设备像素和css像素的因该知道,通常我们在写移动端时,是按照设计稿标注的像素除以设备的DPR来写真实的像素, 比如在iPhone6上,我们写的20px字体世界上在视觉效应上有20px; 所以当我们 ...

  7. Java实现 蓝桥杯 历届试题 波动数列

    问题描述 观察这个数列: 1 3 0 2 -1 1 -2 - 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加a或者减少b ...

  8. vue的第一个commit分析

    为什么写这篇vue的分析文章? 对于天资愚钝的前端(我)来说,阅读源码是件不容易的事情,毕竟有时候看源码分析的文章都看不懂.每次看到大佬们用了1-2年的vue就能掌握原理,甚至精通源码,再看看自己用了 ...

  9. 给Linux小白的CentOS8.1基本安装说明

    写在前面的话:用过Linux的同学应该都会觉得Linux安装是件非常简单的事情,根本不值得用博客记下来!但是我发现,其实没接触过Linux的同学还真不一定会装,就像在IT行业工作过几年但一直用Wind ...

  10. [蓝桥杯]算法提高 GPA

    问题描述 输入A,B两人的学分获取情况,输出两人GPA之差. 输入格式 输入的第一行包含一个整数n表示A的课程数,以下n行每行Si,Ci分别表示第i个课程的学分与A的表现. GPA=Σ(Si*Ci) ...