我的编程空间,编程开发者的网络收藏夹
学习永远不晚

《Java 基础篇》之函数式接口

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

《Java 基础篇》之函数式接口

目录

1、函数式接口概述

2、函数式接口做为方法的参数

3、函数式接口作为方法的返回值

3、常用的函数式接口

3.1、Supplier [səˈplaɪə(r)] Supplier接口

3.2、Consumer接口

3.3、Predicate [ˈpredɪkət , ˈpredɪkeɪt] 接口

 3.4、Function接口

1、函数式接口概述

  • 函数式接口: 有且仅有一个抽象方法的接口。
  • Java中的函数式编程体现就是Lambda表达式。
  • 所以函数式接口即可以适用于Lambda使用的接口。

如何检测一个接口是不是函数式接口? 

  • @FunctionalInterface
  • 放在接口定义的上方:如果接口是函数式接口,编译通过;如果不是,编译失败。
package com.test8;@FunctionalInterfacepublic interface Inter {    void show();}
package com.test8;public class Demo {    public static void main(String[] args) {        Inter i=()-> System.out.println("Hello world!");        i.show();    }}

注意:自定义函数式接口时,@FunctionalInterface是可选的,就算不写这个注解,只要保证满足函数式接口定义的条件,也照样是函数式接口 

2、函数式接口做为方法的参数

如果方法的参数是一个函数式接口,可以使用Lambda表达式作为参数传递 

package com.test9;public class Demo {    public static void main(String[] args) {        //匿名内部类        startThread(new Runnable() {            @Override            public void run() {                System.out.println(Thread.currentThread().getName()+"线程启动");            }        });        //Lambda表达式        startThread(()-> System.out.println(Thread.currentThread().getName()+"线程启动"));    }     private static void startThread(Runnable r){        Thread t=new Thread(r);        t.start();    }}

3、函数式接口作为方法的返回值

如果方法的返回值是一个函数式接口,可以使用Lambda表达式作为结果返回 

package com.test10;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;public class Demo {    public static void main(String[] args) {        ArrayList array=new ArrayList();        array.add("aa");        array.add("b");        array.add("cccc");        array.add("ddd");        System.out.println("排序前:"+array);        Collections.sort(array);//自然排序        System.out.println("自然排序后:"+array);        Collections.sort(array,getComparator());        System.out.println("指定比较器排序后:"+array);    }    private static Comparator getComparator(){        //匿名内部类方式实现//        Comparator comp=new Comparator() {//            @Override//            public int compare(String s1, String s2) {//                return s1.length()-s2.length();//            }////        };//        return comp;        //Lambda表达式//        return (String s1,String s2)->{//            return s1.length()-s2.length();//        };        return (s1,s2)->s1.length()-s2.length();    }}

3、常用的函数式接口

Java8在java.util.function包下预定义了大量的函数数式接口供我们使用

  • Supplier接口
  • Consumer接口
  • Predicate接口
  • Function接口

3.1、Supplier [səˈplaɪə(r)] Supplier接口

Supplier:包含一个无参的方法

  • T get():获得结果
  • 该方法不需要参数,它会按照某种实现逻辑(由Lambda表达式实现)返回一个数据。
  • Supplier接口也称为生产型接口,如果我们指定了接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据供我们使用

案例一:

package com.test11;import java.util.function.Supplier;public class Demo {    public static void main(String[] args) {//        String s=getString(()->{//           return "唐青枫";//        });        String s=getString(()->"唐青枫");        System.out.println(s);                Integer i=getInteger(()->10);        System.out.println(i);    }    private static String getString(Supplier sup){        return sup.get();    }    private static Integer getInteger(Supplier sup){        return sup.get();    }}

 案例二:

package com.test10;import java.util.function.Supplier;public class Test {    public static void main(String[] args) {        int[] arr={1,9,2,7,5};        int maxValue=getMax(()->{            int max=arr[0];            for(int i=1;imax){                    max=arr[i];                }            }            return max;        });        System.out.println(maxValue);    }    private static int getMax(Supplier sup){        return sup.get();    }}

3.2、Consumer接口

Consumer:包含两个方法

  • void accept(T t):对给定的参数执行此操作。
  • default Consumer andThen(Consumer after):返回一个组合的Consumer,依次执行操作,然后执行after操作。
  • Consumer接口也称为消费型接口,它消费的数据的数据类型由泛型指定

案例一:

package com.test10;import java.util.function.Consumer;public class ConsumerDemo {    public static void main(String[] args) {        //Lambda表达式        operatorString("唐青枫",(String name)->{            System.out.println(name);        });        //Lambda表达式        operatorString("唐青枫",name-> System.out.println(name));        //方法引用        operatorString("唐青枫", System.out::println);        //Lambda表达式        operatorString("唐青枫",(String name)->{            String s=new StringBuilder(name).reverse().toString();            System.out.println(s);        });        System.out.println("****************************");        //Lambda表达式        operatorString("曲无忆",name-> System.out.println(name),name->     System.out.println(new StringBuilder(name).reverse().toString()));    }    //消费一个字符串数据    private static void operatorString(String name, Consumer con){        con.accept(name);    }    //用不同的方消费同一个字符串数据两次    private static void operatorString(String name,Consumer con1,Consumer con2){//        con1.accept(name);//        con2.accept(name);        //上两行代码等价于        con1.andThen(con2).accept(name);    }}

 案例二:

package com.test10;import java.util.function.Consumer;public class ConsumerTest {    public static void main(String[] args) {        String[] arr={"唐青枫,20","曲无忆,21","离玉堂,22","叶知秋,23"};        printInfo(arr,                (String str)->{                    String name=str.split(",")[0];                    System.out.print("姓名:"+name);                },                (String str)->{                    int age=Integer.parseInt(str.split(",")[1]);                    System.out.println(",年龄:"+age);                });    }    private static void printInfo(String[] arr, Consumer con1, Consumer con2){        for(int i=0;i

3.3、Predicate [ˈpredɪkət , ˈpredɪkeɪt] 接口

Predicate:常用的四个方法:

  • boolean test(T t):对给定的参数进行判断(判断逻辑由Lambda表达式实现),返回一个布尔值。
  • default Predicate negate():返回一个逻辑的否定,对应逻辑非。
  • default Predicate and(Predicate other):返回一个组合判断,对应短路与。
  • default Predicate or(Predicate other):返回一个组合判断,对应短路或。
  • Predicate接口通常用于判断参数是否满足指定的条件

negate、test案例:

package com.test12;import java.util.function.Predicate;public class Demo {    public static void main(String[] args) {        //Lambda表达式//        boolean b=checkString("Hello",(String str)->{//            return str.length()>8;//        });        boolean b=checkString("Hello",str->str.length()>8);        System.out.println(b);        System.out.println("****************************");        b=checkString1("Hello",str->str.length()>8);        System.out.println(b);    }    private static boolean checkString(String str, Predicate pre){        return pre.test(str);    }    private static boolean checkString1(String str,Predicate pre){//        return !pre.test(str);        //上一句等价于        return pre.negate().test(str);    }}

 and、or案例:

package com.test12;import java.util.function.Predicate;public class Demo1 {    public static void main(String[] args) {        boolean b1=checkString("hello",s->s.length()>8,s->s.length()<15);        boolean b2=checkString("helloworld",s->s.length()>8,s->s.length()<15);        System.out.println(b1);        System.out.println(b2);    }    private static boolean checkString(String str, Predicate pre1, Predicate pre2){//        boolean b1=pre1.test(str);//        boolean b2=pre2.test(str);//        boolean b=b1 && b2;//        return b;        //上述等价于        return pre1.and(pre2).test(str);//判断两个条件和                //对应的有//      return pre1.or(pre2).test(str);//判断两个条件或    }}

案例:筛选满足条件的数据
姓名长度>2且年龄>20

package com.test13;import java.util.ArrayList;import java.util.function.Predicate;public class Demo {    public static void main(String[] args) {        String[] arr={"唐青枫,20","慕晴,21","曲无忆,22","孔雀,23","离玉堂,25"};        //姓名长度>2且年龄>20        ArrayList arrayList=myFilter(arr,str->str.split(",")[0].length()>2,                    str->Integer.parseInt(str.split(",")[1])>20);        for(String str:arrayList){            System.out.println(str);        }    }    private static ArrayList myFilter(String[] arr, Predicate pre1, Predicate pre2){        ArrayList arrayList=new ArrayList();        for(int i=0;i

 3.4、Function接口

Function:常用的两个方法:

  • R apply(T t):将此函数应用于给定的参数。
  • default Function andThen(Function after):返回一个组合函数,首先将该函数应用于输入,然后将after函数应用于结果。
  • Function:接口通常用于对参数进行处理,转换(处理逻辑由Lambda表达式实现),然后返回一个新的值
package com.test14;import java.util.function.Function;public class Demo {    public static void main(String[] args) {        convert("666",(s)->Integer.parseInt(s));        convert(666,i->String.valueOf(i));        convert("666",s->Integer.parseInt(s),i->String.valueOf(i));    }    private static void convert(String s, Function fun){        int i=fun.apply(s);        System.out.println(i);    }    private static void convert(Integer i,Function fun){        String s=fun.apply(i);        System.out.println(s);    }    private static void convert(String s,Function fun1,Function fun2){//        int i=fun1.apply(s);//        String str=fun2.apply(i);        String str=fun1.andThen(fun2).apply(s);        System.out.println(str);    }}

来源地址:https://blog.csdn.net/huangtenglong/article/details/131156175

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

《Java 基础篇》之函数式接口

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【Java 基础篇】Java 函数式接口详解

文章目录 导言一、函数式接口的概念二、函数式接口的语法三、函数式接口的使用方法四、常用的函数式接口总结 导言 函数式接口是 Java 8 引入的重要特性,它允许将函数作为参数传递给方法,或者作为返回值返回。函数式接口主要用于
2023-08-16

java基础教程之接口

定义:接口就是多个类的共有规范(里面的抽象方法),是一种引用数据类型。小提示:基本数据类型包括数值型(整数和浮点数)、字符型、布尔型。格式:public interface 接口名称{//接口内容}备注:接口.java编译后仍然是接口.class接口包含的内容
java基础教程之接口
2019-04-11

java之函数式接口解读

这篇文章主要介绍了java之函数式接口,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-03-01

Java基础学习之接口详解

接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法。本文通过一些示例详细为大家展示了接口的使用,需要的可以参考一下
2022-11-13

java基础之数组常用操作总结(必看篇)

常用的对数组进行的操作1、求数组中最大值,最小值思路:假设下标为0的元素是最大值,遍历数组,依次跟max进行比较,如果有元素比这个max还大,则把这个值赋给max。最小值同样public class TestArray{ public s
2023-05-31

如何使用java函数式接口

这篇文章主要介绍了如何使用java函数式接口,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、函数式接口的由来我们知道使用Lambda表达式的前提是需要有函数式接口,而Lam
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录