函数式接口

函数式接口

只有一个抽象方法的接口,转为lambda而生的接口
接口带有==@FunctionalInterface==

函数式接口当做方法的参数

案例:通过Runnable创建线程,把Runnable接口当做参数进行传递

package com.itxs.demo08;

/**
 * @Classname : demo01
 * @Description : TODO 函数式接口当做参数进行传递
 * @Author : lin_refuel@qq.com
 */
public class demo01 {
    public static void main(String[] args) {
         // 案例:创建线程
        // 方式一:匿名内部类的形式
        MyThread(new Runnable() {
            @Override
            public void run() {
                System.out.println("我是匿名内部类的方式创建的线程");
            }
        });
        // 方式二:完整的lambda
        MyThread(()->{
            System.out.println("完整的lambda创建的线程");
        });
        // 省略的lambda
        MyThread(()-> System.out.println("省略的lambda创建的线程"));
    }
    private static void MyThread(Runnable r){
        new Thread(r).start();
    }
}

运行结果:
在这里插入图片描述

函数式接口作为返回值

案例:字符串长度比较进行排序

package com.itxs.demo08;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/**
 * @Classname : demo02
 * @Description : TODO 字符串的长度进行比较
 * @Author : lin_refuel@qq.com
 */
public class demo02 {
    public static void main(String[] args) {
          // 定义一个String类型集合
        ArrayList<String> list = new ArrayList<>();
         // 添加元素
        list.add("123456555557");
        list.add("1234568");
        list.add("123456789");
        list.add("56789");
        //调用方法
        Collections.sort(list);// 自然规则进行排序
        for (String s : list) {
            System.out.println(s);
        }
        System.out.println("========================");
        Collections.sort(list,getCompare());// getCompare返回设置的比较器

        // 遍历集合
        for (String a:list) {
            System.out.println(a);
        }
    }

    /**
     * 设置比较器的排序规则
     * @return 返回一个Comparator接口
     */
    private static Comparator<String> getCompare() {
        // 匿名内部类的方式
//        return new Comparator<String>() {
//            @Override
//            public int compare(String o1, String o2) {
//                return o1.length() - o2.length(); // 根据字符串长度进行比较 短的在前面
//            }
//        };
        // 通过lambda的方式
           return (o1,o2)->o1.length() - o2.length();
           // 引用方式
         //  return Comparator.comparingInt(String::length);

    }
}

运行结果:
在这里插入图片描述

生产者接口 - Supplier

Supplier

是一个生产者接口,用来生产数据,通常返回的是一个数据(可以使用Lambda表达式)

通过Supplier返回一个字符串和找到数组中的最大值

package com.itxs.demo08;

import java.util.function.Supplier;

/**
 * @Classname : demo01
 * @Description : TODO supplier生产者接口
 * @Author : lin_refuel@qq.com
 */
public class demo01 {
    public static void main(String[] args) {
          // 生产一个数据
          // 匿名内部类重写
//        String str = getString(new Supplier<String>() {
//            @Override
//            public String get() {
//                return "我是字符串";
//            }
//        });
        // lambda形式
//        String str = getString(()->{
//            return "我是一个字符串";
//        });
        // lambda省略方式
        String str = getString(()->"我是字符串".substring(2,4));
        System.out.println(str);
        //======================================================
        // 定义一个数组找到数组中的最大值
        int[] array = {1,2,3,4,5,6,7,8,9,10};
        int max = getMax(()->{
            int Max = array[0];
            for (int i = 1; i < array.length; i++) {
                if(Max < array[i])
                    Max = array[i];
            }
            return Max;
        });
        System.out.println("最大值Max = " + max);
    }

    /**
     * 找出最大值
     * @param sp Supplier接口,重写并调用里面抽象方法get
     * @return 最大值
     */
    private static Integer getMax(Supplier<Integer> sp) {
        return sp.get();
    }

    /**
     * 字符串返回
     * @param sp Supplier接口,重写并调用里面抽象方法get
     * @return 字符串
     */
    public static String getString(Supplier<String> sp) {
        return sp.get();
    }
}

运行结果:
在这里插入图片描述

消费者接口 - Consumer

是一个消费者接口,针对于数据做一些提取的操作,不需要返回值

使用方式:

demo: 对字符串进行操作

package com.itxs.demo08;

import java.util.function.Consumer;

/**
 * @Classname : demo02
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class demo02 {
    public static void main(String[] args) {
        // 匿名内部类
         consumptionCharacters("小肆", new Consumer<String>() {
             @Override
             public void accept(String s) {
                 System.out.println("你的名字是: " + s);
             }
         });
         // lambda方式
        consumptionCharacters("小三",(str)->{
            System.out.println("你的名字反过来是:" + new StringBuilder(str).reverse());
        });
         //=======================================================================
        // Consumer连续消费,例如操作同一个字符串
        consumer02("小三",(str)-> System.out.println(str),(str)-> System.out.println(new StringBuilder(str).reverse()));

    }
    private static void consumptionCharacters(String str, Consumer<String> con){
        con.accept(str);
    }
    private static void consumer02(String str,Consumer<String> con01,Consumer<String> con02){
       // con01.accept(str);//01
        //con02.accept(str);//02
        con01.andThen(con02).accept(str);// 这行代码==上面的01和02缩写
    }
}

运行结果:
在这里插入图片描述

案例:字符串拆分

package com.itxs.demo08;

import java.util.function.Consumer;

/**
 * @Classname : demo03
 * @Description : TODO Consumer - 应用场景
 * @Author : lin_refuel@qq.com
 */
public class demo03 {
    public static void main(String[] args) {
         // 定义一个数组
        String[] name = {"东邪:黄固","西毒:欧阳锋","南帝:段智兴","北丐:洪七公","中神通:王重阳"};
         // 通过Consumer接口使其分开
        separate(name,(info)->{
            // info.split(":")[0]; 相当于是把字符串拆分成了字符数组,取下标为0的
            String outerNumber = info.split(":")[0];
            System.out.println("绰号:" + outerNumber);
        },(info)->{
            String originalName = info.split(":")[1];
            System.out.println("真名:" + originalName);
        });
    }
    private static void separate(String[] info, Consumer<String> con01,Consumer<String> con02){
        for (String s : info) {
            // 两个接口对同一个数组进行操作
            con01.andThen(con02).accept(s);
            System.out.println("=========================");
        }
    }
}

在这里插入图片描述

判断接口 - Predicate

使用方式

通常用于判断参数是否满足指定的条件

demo: 判断参数字符串的长度是否满足条件

package com.itxs.demo08;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;

import java.util.function.Predicate;

/**
 * @Classname : demo04
 * @Description : TODO 判断接口  -Predicate<>()
 * @Author : lin_refuel@qq.com
 */
public class demo04 {
    public static void main(String[] args) {
          // Predicate接口的使用方式
        boolean b01 = res("JavaSE Linux MySQL redis", (str) -> {
            return str.length() > 10;// 判断字符串的长度是否超过10
        });
        System.out.println(b01); // 输出返回值
        System.out.println("===================================");
        boolean b02 = res("JavaSE Linux MySQL redis",
                str -> str.length()>20, // 字符串的长度是否超过20
                str -> str.length() < 30); // 字符串的长度是小于30
        System.out.println(b02);
    }

    /**
     *  根据字符串的是否符合要求来进行返回
     * @param str 目标字符串
     * @param p01 判断接口
     * @return 一个true or false
     */
    private static boolean res(String str,Predicate<String> p01){
        //return p01.test(str); // true
        // !return p01.test(str);// 逻辑非
        return p01.negate().test(str); // 等于上一个行
    }
    /**
     * 多重判断条件
     * @param str 目标字符串
     * @param p01 判断条件接口1
     * @param p02 判断条件接口2
     * @return false or true
     */
    private static boolean res(String str,Predicate<String> p01,Predicate<String> p02){
        //return p01.test(str) && p02.test(str);
        return p01.and(p02).test(str); // 逻辑与 等同于上面一行
    }
}

运行结果:
在这里插入图片描述

应用场景

筛选数据 - 找出年龄超过40的,名字是三个字的

package com.itxs.demo08;

import java.util.ArrayList;
import java.util.function.Predicate;

/**
 * @Classname : demo05
 * @Description : TODO Predicate - 应用场景 (筛选数据)
 * @Author : lin_refuel@qq.com
 */
public class demo05 {
    public static void main(String[] args) {
         // 定义一个字符串数组 , 中原五绝的姓名和年龄
        String[] name = {"黄固,29","欧阳锋,31","段智兴,35","洪七公,43","王重阳,46"};
        // 找出名字长度为3 年龄超过40的
        ArrayList<String> res01 = res(name, (s) -> {
            return s.split(",")[0].length() == 3;// 判断分离的字符串长度是否为3
        }, (s) -> {
            return Integer.parseInt(s.split(",")[1]) > 40;
        });
        System.out.println(res01);
    }

    private static ArrayList<String> res(String[] name, Predicate<String> p01,Predicate<String> p02){
        ArrayList<String> list = new ArrayList<>();// 一个空的集合
        for (String s : name) {
            if(p01.and(p02).test(s)){
                list.add(s); // 满足条件进行添加
            }
        }
        return list;// 返回集合
    }

运行结果:
在这里插入图片描述

加工接口 - Function

接收一个参数,并产生一个结果

Function<T,R>:接口通常用于对参数进行处理,转换(处理逻辑有 啦么大 实现),然后返回一个新的值

demo:

package com.itxs.demo08;

import java.util.function.Function;

/**
 * @Classname : demo06
 * @Description : TODO 加工接口 - 用于数据转换
 * @Author : lin_refuel@qq.com
 */
public class demo06 {
    public static void main(String[] args) {
        // 将字符串转换为Integer类型数据
        // lambda省略方式
        //conversion("9527",str->Integer.parseInt(str));
        // 引用方式
        conversion("9527", Integer::parseInt);
        System.out.println("==========================");
        // 将Integer类型数据转换为String类型
        // lambda省略写法
        //conversion(9527,integer -> String.valueOf(integer));
        // 引用写法
        conversion(9527, String::valueOf);
        System.out.println("==========================");
        // TODO ===========二次加工===========
        conversion("9527",
                s->Integer.parseInt(s+1),// Integer类型数据95271加工出来了
                s->String.valueOf(s+1)); // String类型数据 95272加工出来了

    }

    /**
     * 将String类型数据转为Integer类型
     *
     * @param str  目标字符串
     * @param ft01 转换接口
     */
    private static void conversion(String str, Function<String, Integer> ft01) {
        Integer res = ft01.apply(str); // 字符串9527转为了Integer类型9527
        System.out.println(res + 1);// 9527 + 1 = 9528
    }

    /**
     * 将Integer类型数据转字符串类型
     *
     * @param integer 目标整数类
     * @param ft01    转换接口
     */
    private static void conversion(Integer integer, Function<Integer, String> ft01) {
        String res = ft01.apply(integer); //Integer类型9527转成String类型 9527
        System.out.println(res + 1); // 9527 + 1 = 95271,相当于是字符串拼接
    }

    /**
     * 二次加工
     * 字符串转Integer ,Integer转字符串
     * @param str 目标字符串
     * @param ft01 字符串转Integer的接口
     * @param ft02 Integer转字符串的接口
     */
    private static void conversion(String str, Function<String, Integer> ft01, Function<Integer, String> ft02) {
        String RES = ft01.andThen(ft02).apply(str);
        System.out.println(RES + 1); // String类型95272 + 1 = 952721
    }
}
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,函数式接口是指只有一个抽象方法的接口。Java 8 中引入了Lambda表达式和函数式接口,使得我们可以更方便地编写函数式代码。除了Java预定义的函数式接口外,我们还可以自定义函数式接口。 自定义函数式接口的步骤如下: 1. 创建一个接口并且使用@FunctionalInterface注解来标记它为函数式接口。 2. 在该接口中定义一个抽象方法,这个抽象方法就是我们自定义的函数式接口的唯一方法。 3. 如果需要,可以在接口中定义默认方法和静态方法。 下面是一个示例: ```java @FunctionalInterface interface MyFunctionInterface { int operation(int x, int y); default void printResult(int result) { System.out.println("Result: " + result); } } ``` 在上面的代码中,我们定义了一个自定义函数式接口 `MyFunctionInterface` ,它有一个抽象方法 `operation`,这个方法接受两个整数参数,并且返回一个整数。我们还定义了一个默认方法 `printResult`,用于打印结果。 我们可以使用Lambda表达式来创建一个实现 `MyFunctionInterface` 的对象,如下所示: ```java MyFunctionInterface sum = (x, y) -> x + y; int result = sum.operation(10, 20); sum.printResult(result); // Output: Result: 30 ``` 在上面的代码中,我们使用Lambda表达式来实现 `MyFunctionInterface` 接口,并且使用这个实现来执行加法操作。最后,我们调用 `printResult` 方法来打印结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值