java中函数式接口的使用

一、自己创建的函数式接口

1.1 概念

只存在一个抽象方法的接口。

1.2 使用步骤:

1、创建函数式接口,创建格式参照使用格式。
2、创建一个实例类
3、在实例类中使用函数式接口。

1.3 使用格式:

创建函数式接口的格式:
@FunctionalInterface // 注解,用于检测接口是否为函数式接口,是编译成功、否编译失败
public Interface 接口名称{
public abstract 数据类型(例如:void int boolean) 方法名称();
其他非抽象方法,即默认、静态、私有方法(可以省略)
}

1.4 示例:

@FunctionalInterface
    public interface MyFunctionInterface {
        public abstract void method();
    }

1.5 注意事项:

1、只有一个抽象方法的接口才能称为函数式接口。
2、函数式接口中能存在非抽象方法(即默认、静态、私有方法),非抽象方法根据自己的需要进行编写。
3、函数式接口中实例类中一般作为方法的参数或者返回值使用,或者创建一个接口实现类然后在实例类中调用实现类使用。

二、Supplier接口

2.1 功能

返回泛型参数指定数据类型数据的接口,用于生产数据。

2.2 作为方法参数时的使用步骤

1、在类中创建一个方法,参数为Supplier接口。
2、在主方法中调用该方法,可以传递Supplier接口实现类、Supplier接口加重写方法、Lambda表达式的方式写实现方法。

2.3 注意事项

1、Supplier接口无参数,有返回值
2、Supplier接口返回数据的数据类型根据泛型传递的数据类型决定。

2.4 使用格式

2.4.1、创建方法,参数为Supplier接口
public static 数据类型 方法名(Supplier<数据类型> 参数名){
return 参数名.get();
}
2.4.2、调用方法
使用Supplier接口实现类:
数据类型 变量名 = 方法名称(new Supplier接口实现类);
使用匿名内部类:
数据类型 变量名 = 方法名称(new Supplier<数据类型>(){
@Override
public 数据类型 get(){
处理代码
return 指定数据类型的数据
}
});
使用Lambda表达式:
数据类型 变量名 = 方法名称(()->{
处理代码
return 指定数据类型的数据
});

2.5 示例

使用匿名内部类:
String s3 = getSupplier(new Supplier<String>() {
            @Override
            public String get() {
                return "可莉";
            }
        });

Lambda表达式:
String s1 = getSupplier(()->{
            return 1+"";
        });

三、Consumer接口

3.1 功能

用于对传递进来的数据进行处理的接口,用于消费数据。

3.2 作为方法参数时的使用步骤

1、创建一个方法,参数为需要处理的数据和Consumer接口。
2、在主方法中调用创建的方法,方法中传递需要处理的数据

3.3 注意事项

1、Consumer接口是有参数无返回值。
2、Consumer接口参数数据类型为泛型传递的数据类型。

3.4 使用格式

创建使用Consumer接口的方法:
修饰符(例如:public、private) static(在存在主函数的类中使用是存在) void 方法名(数据类型 变量名1, Consumer<数据类型> 变量名2){
变量名2.accept(变量名1);
}
调用方法:
1、使用Consumer接口实现类:
方法名(变量1, new Consumer接口实现类);
2、使用匿名内部类:
方法名(变量1, new Consumer接口<数据类型>(){
数据处理代码
});
3、使用Lambda表达式:
方法名(变量1,(变量名) -> {
数据处理代码
});

3.5 示例

创建方法:
public static void reverse(String str, Consumer<String> consumer){
        consumer.accept(str);
}
使用匿名内部类
reverse(str1, new Consumer<String>() {
    @Override
    public void accept(String s) {
        String str = new StringBuffer(s).reverse().toString();
        System.out.println(str);
    }
});
使用Lambda表达式
reverse(str1, (s)->{
      String str = new StringBuffer(s).reverse().toString();
      System.out.println(str);
});

3.6 andThen方法

功能:当需要使用多个Consumer接口时,将多个Consumer接口组合到一起使用对数据进行处理。
使用格式
以两个Consumer接口为例:Consumer接口变量名1.andThen(Consumer接口变量名2).accept(需要处理的数据)
示例:
public static void useAndThen(String s, Consumer con1, Consumer con2){
con1.andThen(con2).accept(s);
}
注意事项
1、Consumer接口谁在前面谁先执行。
2、最后必须接accept方法才能处理数据。

四、Predicate接口

4.1 功能

用于对数据进行判断的接口。

4.2 作为方法参数时的使用步骤

1、创建一个方法,方法中传递需要进行判断的数据和Predicate接口,Predicate接口泛型需要与进行判断的数据的数据类型相同。
2、返回predicate接口变量的test方法,test方法中传递需要进行判断的数据。
3、在调用处创建方法,方法中传递需要判断的数据和Predicate接口实例。

4.3 注意事项

1、Predicate接口的test方法会返回一个boolean类型的值作为结果。
2、调用方法时需要将Predicate接口实例化。

4.4 使用格式

创建使用Predicate接口的方法
修饰符(例如:public、private) static(根据实际情况确定是否省略) boolean 方法名(需要判断的数据, Predicate<数据类型> 变量名){
return 变量名.test(需要判断的数据)
}
调用方法
1、使用Predicate接口实现类
方法名(需要判断的数据, new Predicate接口实例类);
2、使用匿名内部类
方法名(需要判断的数据, new Predicate<数据类型>(){
@Override
public boolean test(数据类型 变量名) {
数据判断代码
return 判断的结果;
}
});
3、使用Lambda表达式
方法名(需要判断是数据, (变量名) -> {
数据判断代码
return 判断的结果
})

4.5 示例

方法的创建
    public static boolean usePredicate(String s, Predicate<String> pre){
            return pre.test(s);
    }
方法的调用
    使用匿名内部类方式
    boolean b1 =usePredicate(str1, new Predicate<String>() {
        @Override
        public boolean test(String s) {
            return s.length() > 6;
        }
    });
    使用Lambda表达式
    boolean b2 = usePredicate(str1, (t) -> {
        return t.length() > 6;
    });

4.6 and方法

功能:用于将多个Predicate接口判断的结果连接,当Predicate接口判断结果全为true时返回true,否则返回false。
使用格式:Predicate接口变量名1.and(Predicate接口变量名2).test(需要判断的数据)
示例:pre1.and(pre2).test(s);

4.7 or方法

功能:用于将多个Predicate接口判断的结果连接,当Predicate接口判断结果全为false时返回false,否则返回true。
使用格式:Predicate接口变量名1.or(Predicate接口变量名2).test(需要判断的数据)
示例:pre1.or(pre2).test(s);

4.8 !号

功能:用于将Predicate接口判断的结果取反,当Predicate接口判断结果为false时返回true,为true时返回false。
使用格式:!Predicate接口变量名1.test(需要判断的数据)
示例:!pre1.test(s);

5、Function接口

5.1 功能

数据处理后进行数据类型转换的接口。

5.2 作为方法参数时的使用步骤

1、创建方法,参数为需要转换的数据和Function接口。
2、在方法中调用Function接口的apply方法用于数据类型转换。
3、调用方法,在方法中传递需要转换的数据和Function接口功能实现代码。

5.3 注意事项

1、apply方法有返回值,返回值数据类型为转换后数据的数据类型。
2、调用方法时需要将Function接口实例化。

5.4 使用格式

创建方法格式:
修饰符(即public、private) static(根据情况决定是否数量) 返回值数据类型(如不想有数据返回使用void)
方法名(需要处理的数据, Function<转换前数据类型,转换后数据类型> 变量名1){
转换后数据类型 变量名 = 变量名1.apply(需要转换的数据);
}
使用方法格式:
1、使用Function接口实现类的方式
方法名(需要转换的数据,new Function接口实现类());
2、使用匿名内部类的方式
方法名(需要转换的数据,new Function<转换前数据类型, 转换后数据类型>(){
@Override
public 转换后的数据类型 apply(转换前的数据类型 变量名) {
数据处理代码
return 转换后的数据;
}
});
3、使用Lambda表达式的方式
方式名(需要转换的数据,(变量名) ->{
数据处理代码
return 转换后的数据;
})

5.5 使用示例

创建方法示例:
    public static void function1(String s, Function<String, Integer> fun){
            int n = fun.apply(s);
            System.out.println(n);
        }
调用方法示例:
    function1(str, new Function<String, Integer>() {
        @Override
        public Integer apply(String s) {
            return Integer.parseInt(s);
        }
    });

5.6 andThen()方法

功能:连接两个Function接口的方法。
格式:Function接口变量名1.andThen(Function接口变量名2).apply(需要转换的数据)。
示例:fun1.andThen(fun2).apply(s);