返回顶部
首页 > 资讯 > 后端开发 > JAVA >《Java 基础篇》之函数式接口
  • 211
分享到

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

java开发语言 2023-10-20 17:10:04 211人浏览 薄情痞子
摘要

目录 1、函数式接口概述 2、函数式接口做为方法的参数 3、函数式接口作为方法的返回值 3、常用的函数式接口 3.1、Supplier [səˈplaɪə(r)] Supplier接口 3.2、Consumer接口 3.3、Predicat

目录

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

--结束END--

本文标题: 《Java 基础篇》之函数式接口

本文链接: https://lsjlt.com/news/433129.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 《Java 基础篇》之函数式接口
    目录 1、函数式接口概述 2、函数式接口做为方法的参数 3、函数式接口作为方法的返回值 3、常用的函数式接口 3.1、Supplier [səˈplaɪə(r)] Supplier接口 3.2、Consumer接口 3.3、Predicat...
    99+
    2023-10-20
    java 开发语言
  • 【Java 基础篇】Java 函数式接口详解
    文章目录 导言一、函数式接口的概念二、函数式接口的语法三、函数式接口的使用方法四、常用的函数式接口总结 导言 函数式接口是 Java 8 引入的重要特性,它允许将函数作为参数传递给方法,或者作为返回值返回。函数式接口主要用于...
    99+
    2023-08-16
    java jvm 开发语言
  • Java基础第五篇 实施接口
    目录 1、interface2、分离接口的意义3、实施多个接口 4、总结在上一篇文章封装与接口中,private关键字封装了对象的内部成员。经过封装,产品隐藏了内...
    99+
    2024-04-02
  • java基础教程之接口
    定义:接口就是多个类的共有规范(里面的抽象方法),是一种引用数据类型。小提示:基本数据类型包括数值型(整数和浮点数)、字符型、布尔型。格式:public interface 接口名称{ //接口内容 }备注:接口.java编译后仍然是接口...
    99+
    2019-04-11
    java入门 java 接口
  • Java基础第四篇 封装与接口
    目录1、封装与接口2、对象成员的封装3、类的封装4、总结前言: 总结之前的内容,对象(object)指代某一事物,类(class)指代象的类型。对象可以有状态和动作,即数据成员和方法...
    99+
    2024-04-02
  • java之函数式接口解读
    目录一、函数式接口@FunctionalInterface注解性能浪费的日志案例使用Lambda优化日志案例使用Lambda作为参数和返回值二、常用函数式接口Supplier接口Co...
    99+
    2023-03-01
    java函数式接口 java接口 函数式接口
  • java理论基础函数式接口特点示例解析
    目录一、函数式接口是什么?二、函数式接口的特点三、default关键字四、JDK中的函数式接口举例五、自定义Comparator排序一、函数式接口是什么? 所谓的函数式接口,实际上就...
    99+
    2024-04-02
  • Java8函数式接口的基础学习教程
    函数式接口 1.1 函数式接口概述 函数式接口:有且仅有一个抽象方法的接口 Java中的函数式编程体现就是Lambda表达式,所以函数式接口就是可以使用与Lambda使用的接口 只...
    99+
    2024-04-02
  • Java基础学习之接口详解
    目录概述定义格式含有抽象方法含有默认方法和静态方法含有私有方法和私有静态方法基本的实现实现的概述抽象方法的使用默认方法的使用静态方法的使用私有方法的使用接口的多实现抽象方法默认方法静...
    99+
    2022-11-13
    Java接口使用 Java接口
  • 一篇文章带你了解Java基础-接口
    目录Java基础知识(接口)接口接口的定义接口和抽象的区别接口的格式接口中的主要成分接口的案例接口与接口的关系JDK 8之后的接口新增方法总结Java基础知识(接口) 接口 Jav...
    99+
    2024-04-02
  • python基础篇之pandas常用基本函数汇总
    目录前言1、汇总函数2、特征统计函数3、唯一值函数4、替换函数总结前言 这篇主要整理pandas常用的基本函数,主要分为五部分: 汇总函数特征统计函数唯一值函数替换函数排序函数 1、...
    99+
    2024-04-02
  • 【Java 基础篇】Java 正则表达式
    文章目录 导言一、正则表达式的基本概念二、使用正则表达式的步骤三、示例代码1. 匹配字符串2. 提取匹配的内容3. 替换字符串 总结 导言 正则表达式是一种强大的文本模式匹配工具...
    99+
    2023-09-18
    java 正则表达式 python
  • Java入门基础之抽象类与接口
    目录一.抽象类1.什么是抽象类2.语法规则3.抽象类的作用二.接口1.什么是接口2.语法规则3.实现多个接口4.接口之间的继承三.接口的使用实例1. Comparable 接口2.C...
    99+
    2024-04-02
  • python基础之函数
    函数: # 什么是函数:一系列python语句的组合,可以在程序中运行一次或者多次 # 一般是完成具体的独立的功能 # 为什么要使用函数 # 代码的复用最大化以及最小化冗余代...
    99+
    2024-04-02
  • java基础之接口组成更新的实现
    目录1.1 接口组成更新概述1.2 接口中默认方法(JDK8)1.3 接口中静态方法(JDK8)1.4 接口中私有方法(JDK9)1.1 接口组成更新概述 接口的组成 常量:publ...
    99+
    2024-04-02
  • Java基础篇之分布式版本控制工具Git
    目录版本控制版本控制分类1.本地版本控制2.集中版本控制SVN3.分布式版本控制Git和SVN的区别Git的历史:常用的Linux命令Git配置Git基本理论(重要)Git项目搭建本...
    99+
    2024-04-02
  • typeScript 核心基础之接口interface
    目录1、接口定义2、接口继承3、类实现接口前言: 在面向对象语言中,接口是一个很重要的概念,它是对行为的抽象。接口也叫 interface 。 在 js 中没有接口这个概念,它是新增...
    99+
    2024-04-02
  • 深入解析Java反射之基础篇
    目录前言一、回顾:什么是反射?二、反射的主要用途三、反射的基本运用1、获得 Class 对象2、判断是否为某个类的实例3、创建实例4、获取方法5、获取构造器信息6、获取类的成员变量(...
    99+
    2024-04-02
  • Java基础篇之反射机制详解
    目录1、反射概述1.1什么是反射1.2、反射能干什么2、解剖类2.1反射构造方法2.1.1反射无参的构造函数2.1.2反射“一个参数”的构造函数2.1.3反射...
    99+
    2024-04-02
  • python之基础篇(五)——数据类型
    防伪码:忘情公子著  前面四篇我们已经讲了许多概念方面的东西,从此篇开始,我们将真正开始学习python。  在上一篇中,我们已经说过python有哪些核心数据类型,接下来我们将一一细说这些数据类型。python数据类型之数字类型  pyt...
    99+
    2023-01-31
    数据类型 基础 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作