0
点赞
收藏
分享

微信扫一扫

Java基础学习之常用函数式接口(35)

7dcac6528821 2022-04-13 阅读 60
java

常用函数式接口:

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

1.1 Supplier接口

Supplier< T >:包含一个无参的方法

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

import java.util.function.Supplier;

public class demo1 {
    public static void main(String[] args) {
        String s = getString(() -> {
            return "lyy";
        });
        System.out.println(s);

        Integer i = getInteger(()->30);
        System.out.println(i);
    }
    //定义一个方法返回一个字符串数据
    private static Integer getInteger(Supplier<Integer> sup){
        return sup.get();
    }
    //定义一个方法返回一个字符串数据
    private static String getString(Supplier<String> sup){
        return sup.get();
    }
}

获取数组中最大值:

package Java35.Demo1;

import java.util.function.Supplier;

public class Demo2 {
    public static void main(String[] args) {
        //定义一个数组
        int[] arr = {31,23,32,42,53,13};
        int maxvalue = getMax(() -> {
            int max = arr[0];
            for (int i = 1; i < arr.length; i++) {
                if (arr[i] > max) {
                    max = arr[i];
                }
            }
            return max;
        });
        System.out.println(maxvalue);
    }
    private static int getMax(Supplier<Integer> sup){
        return sup.get();
    }
}

1.2 Consumer接口

两个方法:

  • void accept(T t) :对给定的参数执行此操作。
  • default Consumer< T > andThen(Consumer<? super T> after) :返回一个组合的 Consumer ,按顺序执行该操作,然后执行 after操作。
  • 该接口也称为消费型接口,数据类型由泛型指定
package Java35.Demo1;

import java.util.function.Consumer;

public class demo3 {
    public static void main(String[] args) {
//        operatorSting("lyy",(String s)->{
//            System.out.println(s);
//        });
        operatorSting("lyy",s-> System.out.println(s));
//        operatorSting("lyy",System.out::println);

        operatorSting("lyy",s->{
            System.out.println(new StringBuilder(s).reverse().toString());
        });

        operatorSting("lyy",s-> System.out.println(s),s->System.out.println(new StringBuilder(s).reverse().toString()));
    }
    //定义一个方法,用不同的方式消费同一个字符串数据两次
    private static void operatorSting(String name, Consumer<String> con1,Consumer<String> con2){
//        con1.accept(name);
//        con2.accept(name);
        con1.andThen(con2).accept(name);
    }

    //定义一个方法,消费一个字符串数据
    private static void operatorSting(String name, Consumer<String> con){
        con.accept(name);
    }
}

package Java35.Demo1;

import java.util.function.Consumer;

public class demo4 {
    public static void main(String[] args) {
        String[] strArray = {"lyy,24","lyq,24","sss,32"};

        printInfo(strArray,(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[] strArray, Consumer<String> con1,Consumer<String> con2){
        for(String str:strArray){
            con1.andThen(con2).accept(str);
        }
    }
}

1.3 Predicate接口

常用的四个方法:

default Predicate and(Predicate<? super T> other) :返回一个组合的谓词,表示该谓词与另一个谓词的短路逻辑AND。

default Predicate negate() :返回表示此谓词的逻辑否定的谓词。

default Predicate or(Predicate<? super T> other) :返回一个组合的谓词,表示该谓词与另一个谓词的短路逻辑或。

boolean test(T t) :在给定的参数上评估这个谓词。

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

package Java35.Demo1;

import java.util.function.Predicate;

public class demo5 {
    public static void main(String[] args) {
//        boolean b1 = checkString("hello", (String s) -> {
//            return s.length() > 8;
//        });
//        System.out.println(b1);
        boolean b1 = checkString("hello",s -> s.length()>8);
        System.out.println(b1);

        boolean b2 = checkString("helloworld",s->s.length()>8);
        System.out.println(b2);
    }
    //判断给定的字符串是否满足要求
    private static boolean checkString(String s, Predicate<String> pre){
//        return pre.test(s);
//        return !pre.test(s);
        return pre.negate().test(s);
    }

}

package Java35.Demo1;

import java.util.function.Predicate;

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

        boolean b2 = checkString("hello",s->s.length()>8,s -> s.length()<15);
        System.out.println(b2);

        boolean b3 = checkString("helloworld",s->s.length()>8,s -> s.length()<15);
        System.out.println(b3);
    }
    //判断给定的字符串是否满足要求
    private static boolean checkString(String s, Predicate<String> pre) {
        return pre.test(s);
    }
    //同一个字符串给出两个不同的判断条件,最后把这两个判断的结果做逻辑与运算的结果作为最终结果
    private static boolean checkString(String s, Predicate<String> pre1,Predicate<String> pre2){
//        boolean b1 = pre1.test(s);
//        boolean b2 = pre2.test(s);
//        boolean b = b1&&b2;
//        return b;
//        return pre1.and(pre2).test(s);
        return pre1.or(pre2).test(s);
    }
}

package Java35.Demo1;

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

public class demo8 {
    public static void main(String[] args) {
        String[] strArray = {"lyyda,24","de,41","dia,34"};

        ArrayList<String> array = detection(strArray, s -> s.split(",")[0].length() > 2,
                s -> Integer.parseInt(s.split(",")[1]) > 33);
        System.out.println(array);
    }
    private static ArrayList<String> detection(String[] strArray, Predicate<String> pre1, Predicate<String> pre2){
        //定义一个集合
        ArrayList<String> array = new ArrayList<String>();
        //遍历数组
        for (String str:strArray){
            if(pre1.and(pre2).test(str)){
                array.add(str);
            }
        }

        return array;

    }
}

1.4 Function接口

常用方法:
default Function<T,V> andThen(Function<? super R,? extends V> after) :返回一个组合函数,首先将该函数应用于其输入,然后将 after函数应用于结果。

R apply(T t) :将此函数应用于给定的参数。

举报

相关推荐

0 条评论