JAVA常用函数式接口

Java中的常用函数式接口

本文介绍四种常用的函数式接口

1.Supplier接口(生产接口)

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

下面是它的一个简单应用

import java.util.function.Supplier;

public class SupplierDemo {
    public static void main(String[] args) {
        String s = getString(() -> "ljy");
        System.out.println(s);

        Integer i = getInteger(() -> 555);
        System.out.println(i);
    }

    //定义一个方法返回一个字符串
    private static String getString(Supplier<String> sup) {
        return sup.get();
    }

    //定义一个方法返回一个整数数字
    private static Integer getInteger(Supplier<Integer> sup) {
        return sup.get();
    }
}

2.Consumer接口(消费接口)

Consumer<T>:包含两个方法

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

下面有几个简单的案例

public class ConsumerDemo {
    public static void main(String[] args) {
        //lambda表达式
        operatorString("ljy", s -> System.out.println(s));
        //方法引用
        operatorString("ljy",System.out::println);

        operatorString("ljy",s-> System.out.println(new StringBuilder(s).reverse().toString()));

        operatorString("ljy",s-> System.out.println(s),s-> System.out.println(new StringBuilder(s).reverse().toString()));
    }

    private static void operatorString(String name, Consumer<String> con) {
        con.accept(name);
    }

    private static void operatorString(String name,Consumer<String>con1,Consumer<String>con2){
        con1.andThen(con2).accept(name);
    }
}

 

import java.util.function.Consumer;

public class ConsumerDemo2 {
    public static void main(String[] args) {
        String[] strArray={"ljy,18","znx,19","zsy,20"};

        printInfo(strArray,str-> System.out.print("姓名:"+str.split(",")[0]),
                str-> System.out.println(",年龄:"+str.split(",")[1]));
    }

    //info(信息,情报)
    private static void printInfo(String[] strArray, Consumer<String>con1,Consumer<String>con2){
        for(String str:strArray){
            con1.andThen(con2).accept(str);
        }
    }
}

3.Predicate接口(判断接口)

Predicate<T>:常用的四个方法

  • boolean test(T t):对给定的参数进行判断(判断逻辑由Lambda表达式实现),返回一个布尔值
  • default Predicate<T> negate():返回一个逻辑的否定,对应逻辑非
  • default Predicate<T> and(Prduicate other):返回一个组合判断,对应短路与
  • default Predicate<T> or(Predicate other):返回一个组合判断,对应短路或

下面同样给出下面的简单案列

public class PredicateDemo1 {
    public static void main(String[] args) {
        boolean b1 = cheakString("hello", s -> s.length() > 8);
        System.out.println(b1);
        boolean b2 = cheakString("helloworld",s->s.length()>8);
        System.out.println(b2);
    }

    private static boolean cheakString(String s, Predicate<String> pre){
        return pre.test(s);
        //若要使结果相反
        //return pre.negate().test(s);
    }
}
import java.util.function.Predicate;

public class PredicateDemo2 {
    public static void main(String[] args) {
        boolean b = cheakString("helloworld", s -> s.length() > 5, s -> s.length() < 8);
        System.out.println(b);
    }

    private static boolean cheakString(String s, Predicate<String> pre1,Predicate<String>pre2){
        return pre1.and(pre2).test(s);
        //等价于
//        Boolean b1 = pre1.test(s);
//        Boolean b2 = pre2.test(s);
//        return b1&&b2;

        //pre1.or(pre2).test(s);
    }
}
import java.util.ArrayList;
import java.util.function.Predicate;

public class PredicateDemo3 {
    public static void main(String[] args) {
        String[] strArray= {"林青霞,30","柳岩,34","张曼玉,35","貂蝉,31","王祖贤,33"};
        ArrayList array = array(strArray, s -> s.split(",")[0].length() > 2,
                s -> Integer.parseInt(s.split(",")[1]) > 33);
        System.out.println(array);
    }

    private static ArrayList array(String[] s, Predicate<String> pre1, Predicate<String>pre2){
        ArrayList array = new ArrayList();
        for(String str:s) {
            if(pre1.and(pre2).test(str)){
                array.add(str);
            }
        }
        return array;
    }
}

4.Function接口(转换接口)

  • Function<T,R>︰常用的两个方法
  • R apply(Tt):将此函数应用于给定的参数
  • default V> Function andThen(Function after):返回一个组合函数,首先将该函数应用于输入,然后将after函数应用于结果Function<T,R>接口通常用于对参数进行处理,转换(处理逻辑由Lambda表达式实现),然后返回一个新的值

下面给出以下案列

import java.util.function.Function;

public class FunctionDemo1 {
    public static void main(String[] args) {
        convert("100", s -> Integer.parseInt(s));

        convert(100, i -> String.valueOf(i + 556));

        convert("100",s -> Integer.parseInt(s),i->String.valueOf(i+556));
    }

    //定义一个方法,把一个字符串转换为int类型,在控制台输出
    private static void convert(String s, Function<String, Integer> fun) {
        Integer i = fun.apply(s);
        System.out.println(i);
    }

    //定义一个方法,把一个int类型的数据加上一个整数后,转换为字符串在控制台上输出
    private static void convert(int i, Function<Integer, String> fun) {
        String s = fun.apply(i);
        System.out.println(s);
    }

    //定义一个方法,把一个字符串转换为int类型,把int类型加上一个整数后,转换为字符串在控制台输出
    private static void convert(String s,Function<String,Integer>fun1,Function<Integer,String>fun2){
        Integer i = fun1.apply(s);
        String ss = fun2.apply(i);
        System.out.println(ss);

        //可以用andThen改进
        //fun1.andThen(fun2).apply(s);
    }
}
//练习
//    Strings ="ljy,18";
//    请按照我指定的要求进行操作:
//    1:将字符串截取得到数字年龄部分
//    2:将上一步的年龄字符串转换成为int类型的数据
//    3:将上一步的int数据加70,得到一个int结果,在控制台输出请通过Function接口来实现函数拼接
//    常

import java.util.function.Function;

public class FunctionDemo2 {
    public static void main(String[] args) {
        convert("ljy,18",s -> s.split(",")[1],s -> Integer.parseInt(s),
                i->i+70);
    }

    private static void convert(String s, Function<String,String>fun1,
                                Function<String,Integer>fun2,
                                Function<Integer,Integer>fun3){
        System.out.println(fun1.andThen(fun2).andThen(fun3).apply(s));
    }
}

运用好这些函数接口还是要掌握Lambda表达式的运用

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值