首页 > 编程语言 >深度剖析JAVA 函数式接口

深度剖析JAVA 函数式接口

时间:2023-08-05 15:36:12浏览次数:31  
标签:JAVA 函数 void 接口 剖析 FunctionalInterface str public

一、什么是函数式接口:

函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。可以有多个非抽象方法。 为了避免别人在这个接口中增加接口函数导致其有多个接口函数需要被实现,变成"非函数接口”,可以在接口上加上一个注解@FunctionalInterface, 这样别人就无法在里面添加新的接口函数了。

  1. FunctionalInterface是什么?

FunctionalInterface 中文称之为 函数式接口。是Java新特性之一,所谓的函数式接口,只能有一个抽象方法的接口(Interface) 2. FunctionalInterface有什么作用?

作为Java的新特性之一,主要是标识某一类接口,如果满足以上特性(只能有一个抽象方法的接口(Interface)), 就可以使用@FunctionalInterface注解。

一般是配合Lambda表达式一起使用。

二、函数式接口四大核心函数:

1.消费型接口:Consumer 有参无返回值 值

@FunctionalInterface public interface Consumer<T> { /** * Performs this operation on the given argument. * Params:t- the input argument */ void accept(T t); }

2.供给型接口:Supplier 无参有返回值,用于提供数据源的

@FunctionalInterface public interface Supplier<T> { /** * Gets a result. * Returns:a result */ T get(); }

3.函数型接口:Function 最典型的是Function,有参有返回值,接受一个T类型的参数,并返回一个R类型的返回值

@FunctionalInterface public interface Function<T, R> { /** * Applies this function to the given argument. * Params: t- the function argument * Returns: the function result */ R apply(T t); }

4.断言型接口:Predicate 有参有返回值,返回值是boolean类型,用来判断某项条件是否满足。经常用来进行筛滤操作

@FunctionalInterface public interface Predicate<T> { /** * Evaluates this predicate on the given argument. * Params: t - the input argument * Returns: true if the input argument matches the predicate, otherwise false */ boolean test(T t); }

三、四大函数的实现调用

//对四大核心函数实现 Consumer<String> consumer = (str) -> { System.out.println(str); };

Supplier<String> supplier = () -> {
    return "我是供给型接口";
};

Function<String, String> function = (str) -> {
    return "hello," + str;
};

Predicate<Integer> predicate = (i) -> {
    return i > 10;
};

void conDemo(String str, Consumer<String> consumer) {//把lambda表达式当成参数传递
    consumer.accept(str);
}

String supDemo(Supplier<String> supplier) {
    return supplier.get();
}

String funDemo(String str2, Function<String, String> function) {
    return function.apply(str2);
}

boolean preDemo(Integer i, Predicate<Integer> predicate) {
    return predicate.test(i);
}

String str = "消费型接口";

@Test
void conDemo2() {
    conDemo(str, consumer);//打印结果:消费型接口
}

@Test
void supDemo2() {
    System.out.println(supDemo(supplier));//打印结果:我是供给型接口
}

String str2 = "我是函数式接口";

@Test
void funDemo2() {
    System.out.println(funDemo(str2, function));//打印结果:hello,我是函数式接口
}

Integer i = 12;

@Test
void preDemo2() {
    System.out.println(preDemo(i, predicate));//打印结果:true
}

四、其他函数式接口:

Runnable:

@FunctionalInterface public interface Runnable { public abstract void run(); }

Callable:

@FunctionalInterface public interface Callable<V> { V call() throws Exception; } Comparator:

@FunctionalInterface public interface Comparator<T> { int compare(T o1, T o2); }

标签:JAVA,函数,void,接口,剖析,FunctionalInterface,str,public
From: https://blog.51cto.com/teayear/6975590

相关文章

  • 输入字符串查找字符串中都有什么组成 java代码如下
    importjava.util.Scanner;publicclassDemo02{publicstaticvoidmain(String[]args){System.out.println("请输入一个字符串:");Stringcc=newScanner(System.in).nextLine();char[]arr=cc.toCharArray();intcoun......
  • 网络接口dhcp失败时会获得一个169.254.x.x的IP地址
    最开始发现这个现象是在windows上面,之前以为是dhcp失败后,会有个随机值作为IP地址,以为是个垃圾数据,是windows特有的行为。最近一个项目,基于buildroot构建,用到4G上网功能,在开发其他功能,一直没插SIM卡,总发现4G接口会拿到一个奇怪的IP地址169.254.118.160。测试把这个问题当作一个bug......
  • java-concurrent-interview-must
    10道不得不会的Java并发基础面试题以下都是Java的并发基础面试题,相信大家都会有种及眼熟又陌生的感觉、看过可能在短暂的面试后又马上忘记了。JavaPub在这里整理这些容易忘记的重点知识及解答,建议收藏,经常温习查阅。评论区见1.start()方法和run()方法的区别如果只是调用run(......
  • java题
    equals与==的区别1、功能不同"=="是判断两个变量或实例是不是指向同一个内存空间。"equals"是判断两个变量或实例所指向的内存空间的值是不是相同。2、定义不同"equals"在JAVA中是一个方法。"=="在JAVA中只是一个运算符合。3、运行速度不同"=="比"equ......
  • 业务功能探索之条件分支全覆盖,includes能否一劳永逸【玩转JavaScript】
    灵感闪现某天,正在认真的敲代码,突然同事问了我一个问题,虽然不难,但是解决方案还是挺有趣的。所以写写这篇文章,详细记录一下实现过程。这个功能来自业务功能中的条件分支全覆盖,原本的做法一个includes轻松搞定,而这次,我心生了一点点疑问:includes真的能一劳永逸吗?JS实验开始includes不......
  • java多线程并发面试题总结(史上最全40道)
    1、多线程有什么用?一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个......
  • java多线程并发面试题总结(史上最全40道)
    1、多线程有什么用?一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个问......
  • 传奇架设技术传奇引擎BLUEM2引擎中任意魔法接口设置方法
    功能:任意魔法接口.不再限制为几个简单的魔法了.使用此引擎的朋友也可以Diy魔法了示例:目标触发为[@MagTagFuncXXX].当前人物触发为[@MagSelfFuncXXX].XXX为魔法ID.建议做大点.不要太接近现有的魔法ID.;新增魔法ID为248的魔法.鼠标有目标时则触发QFunction-0.txt中的[@MagTagFunc248]......
  • 基于java的商场停车场系统
    商场停车场作为一个业务比较繁忙的重点管理场所,大多数商场停车场的管理者都主要考虑降低成本,提升商场停车场服务满意度。一年一度的商场促销大促销活动,引来众多的消费者,也停车场带来了沉重的停车压力,如何能够最大限度的提升停车场管理工作效率成为热门的研究课题。本文通过调研商场......
  • Java克隆
    为什么我们要使用克隆?答:想对一个对象进行操作处理,又想保留原有的数据进行接下来的操作。允许在不影响原始对象的情况下创建相同的对象。通俗理解:就是我用我的复制人去干任何事我都不怕。注意:克隆不适用于所有情况。对于某些对象来说,使用克隆可能会导致意外的行为。此外,在某些情况下......