一、什么是函数式接口

1、只包含一个抽象方法的接口,称为函数式接口。

2、你可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。

3、我们可以在任意函数式接口上使用@FunctionalInterface注解,这样做可以检查它是否是一个函数式接口,同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。

例如:

@FunctionalInterface
public interface MyFucntion2<T,R> { public R getValue(T t1,T t2);
}

以下对这个函数式接口进行测试:

 @Test
public void test2(){
Long op = op(200L, 300L, (x, y) -> x + y);
System.out.println(op);
} public Long op(Long l1,Long l2,MyFucntion2<Long,Long> myFucntion2){
return myFucntion2.getValue(l1,l2);
}

二、Java内置四大核心函数式接口

在学习lambda表达式的时候,我们知道,要使用lambda表达式,我们就要创建一个函数式接口,那每次用lambda表达式的时候岂不是很麻烦,这时候,java给我们内置了四大核心函数式接口:

1、 Consumer<T> : 消费型接口,void accept(T t);

代码示例:

@Test
public void test3(){
consumenMoney(2312,(m)-> {
if (m>1000){
System.out.println("买衣服花了 1000,还剩"+(m-1000));
m-=1000;
}
if (m>1000){
System.out.println("买鞋花了 1000,还剩"+(m-1000));
m-=1000;
}
System.out.println("最后还剩"+m);
});
}
public void consumenMoney(double money, Consumer<Double> comsumer){
//可以实现 Consumer接口怎么花钱
comsumer.accept(money);
}

2、 Supplier<T> : 供给型接口,T get();

   代码示例:

    @Test
public void test4(){
int id=0;
List<Apple> list = getAppleList(5,()->{
Apple apple1 = new Apple(id,"苹果1",new BigDecimal("3"),10);
return apple1;
});
list.forEach(System.out::println);
} //产生指定数量的苹果
public List<Apple> getAppleList(int num ,Supplier<Apple> supplier){
List<Apple> list = new ArrayList<>();
for (int i = 0; i <num ; i++) {
Apple apple = supplier.get();
list.add(apple);
}
return list;
}

3、Function<T, R> : 函数型接口,R apply(T t);

代码示例:

@Test
public void test5() {
String trimStr=strHandler("\t\t 你好,world! ",(String::trim);
System.out.println(trimStr); String sumString=strHandler("Helloworld!",(str)->str.substring(2, 4));
System.out.println(sumString);
}
//需求:用于处理字符串
public String strHandler(String str,Function<String,String> fun) {
return fun.apply(str);
}

4、 Predicate<T> : 断言型接口,boolean test(T t);

代码示例:

@Test
public void test5() {
List<String> list=Arrays.asList("Hello","world","hi","o","123");
List<String> filterStr = filterStr(list, (str)->str.length()>1);
filterStr.forEach(System.out::println);
} //需求:将满足条件的字符串,放入集合中
public List<String> filterStr(List<String> list, Predicate<String> pre){
List<String> list2=new ArrayList<>();
list.forEach((str)->{
if(pre.test(str)){
list2.add(str);
} }); return list2;
}

三、其他接口

我们熟悉的:

public interface Runnable { void run(); }
public interface Callable<V> { V call() throws Exception; }
public interface ActionListener { void actionPerformed(ActionEvent e); }
public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); }

JAVA8 函数式接口的更多相关文章

  1. java代码之美(14)---Java8 函数式接口

    Java8 函数式接口 之前写了有关JDK8的Lambda表达式:java代码之美(1)---Java8 Lambda 函数式接口可以理解就是为Lambda服务的,它们组合在一起可以让你的代码看去更加 ...

  2. java代码(14) --Java8函数式接口

    Java8函数式接口 之前有关JDK8的Lambda表达式 Java代码(1)--Java8 Lambda 函数式接口可以理解就是为Lambda服务的,它们组合在一起可以让你的代码看去更加简洁 一.概 ...

  3. Java8 函数式接口-Functional Interface

    目录 函数式接口: JDK 8之前已有的函数式接口: 新定义的函数式接口: 函数式接口中可以额外定义多个Object的public方法一样抽象方法: 声明异常: 静态方法: 默认方法 泛型及继承关系 ...

  4. Java8函数式接口和Lambda表达式

    两者关系: Lambda表达式就是函数式接口(FunctionalInterface)实现的快捷方式,它相当于函数式接口实现的实例,因为在方法中可以使用Object作为参数,所以把Lambda表达式作 ...

  5. java8 函数式接口——Function/Predict/Supplier/Consumer

    Function 我们知道Java8的最大特性就是函数式接口.所有标注了@FunctionalInterface注解的接口都是函数式接口,具体来说,所有标注了该注解的接口都将能用在lambda表达式上 ...

  6. java8函数式接口(Functional Interface)

    介绍 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. 函数式接口可以被隐式转换为 lambda 表达式(箭头函数). 函数式接口代 ...

  7. Java8 函数式接口 @FunctionalInterface以及常用Consumer<T>、Supplier<T>、Function<T, R>、Predicate<T>总结

    首先看看什么是Lambda 表达式 Lambda是一个匿名函数,我们可以把Lambda表达式理解为一段可以传递的代码(将代码像数据一样传递):最简单的Lambda表达式可由逗号分隔的参数列表.-> ...

  8. [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

    函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...

  9. Java8函数式接口/Lambda表达式/接口默认方法/接口静态方法/接口冲突方法重写/lambda表达式指定泛型类型等

    一:函数式接口 1.函数式接口的概念就是此接口必须有且只能有一个抽象方法,可以通过@FunctionalInterface来显示规定(类似@Override),但是没有此注解的但是只有一个抽象方法的接 ...

  10. java8函数式接口小例子

    // Function<T, R> -T作为输入,返回的R作为输出 Function<String,String> function = (x) -> {System.o ...

随机推荐

  1. VS Code使用.vue的v-for方法提示错误的解决办法

    1.在使用v-for的时候在后面跟上:key="key" <div v-for="(value, key) in [1,2,3]" :key=" ...

  2. 使用GDI+显示OpenCV中的图像IplImage

    OpenCV虽然自带了轻量级的界面库HighGUI,但是支持的图像化元素实在是太少了,一般只在前期算法测试时使用.实际产品还是使用MFC库.因此本文记录了如何在GDI+中显示OpenCV中的IplIm ...

  3. python scipy库

    三.假定正态分布,求解1倍标准差和0.5倍标准差的概率? 二.求解多元线性或非线性方程组解 一.求解3元一次方程 1.学习资料  https://github.com/lijin-THU/notes- ...

  4. Axure下载,附注册码

    下载地址:https://www.axure.com.cn/3510/ 汉化教程:https://www.axure.com.cn/2616/ 注册码: Axure RP 8.1.0.3377--可用 ...

  5. Android进阶——Android视图工作机制之measure、layout、draw

    自定义View一直是初学者们最头疼的事情,因为他们并没有了解到真正的实现原理就开始试着做自定义View,碰到很多看不懂的代码只能选择回避,做多了会觉得很没自信.其实只要了解了View的工作机制后,会发 ...

  6. Vue v-bind

    指令作用: 给元素的属性赋值 它是一个 vue 指令,用于绑定 html 属性 写法: 正常写法 <div v-bind:原属性名="变量||"常量""& ...

  7. 51nod 1013:3的幂的和 快速幂

    1013 3的幂的和 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 求:3^0 + 3^1 +...+ 3^(N) mod 1000000007 ...

  8. Tensorflow学习教程------tensorboard网络运行和可视化

    tensorboard可以将训练过程中的一些参数可视化,比如我们最关注的loss值和accuracy值,简单来说就是把这些值的变化记录在日志里,然后将日志里的这些数据可视化. 首先运行训练代码 #co ...

  9. Q3:Longest Substring Without Repeating Characters

    3. Longest Substring Without Repeating Characters 官方的链接:3. Longest Substring Without Repeating Chara ...

  10. CentOS 7.3 安装redis 4.0.2服务

    CentOS 7.3 安装redis 4.0.2服务 1.下载解压 下载地址:/home/xiaoming/ wget http://download.redis.io/releases/redis- ...