JAVA从零开始学习知识整理——day12—【函数式接口】

一、函数式接口
1.1 有且仅有一个抽象方法的接口
1.2 @FunctionalInterface注解
定义在一个接口上,一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。不使用也无妨。
1.3 自定义函数式接口
对于刚刚定义好的 MyFunctionalInterface 函数式接口,典型使用场景就是作为方法的参数:
代码如下:

	public class Demo09FunctionalInterface {
			// 使用自定义的函数式接口作为方法参数
					private static void doSomething(MyFunctionalInterface inter) {
					inter.myMethod(); // 调用自定义的函数式接口方法
			}
					public static void main(String[] args) {
				// 调用使用函数式接口的方法
			doSomething(() ‐> System.out.println("Lambda执行啦!"));
		}
}

二、函数式编程
2.1 使用lambda作为参数和返回值
如果一个方法的返回值类型是一个函数式接口,那么就可以直接返回一个Lambda表达式。当需要通过一
个方法来获取一个 java.util.Comparator 接口类型的对象作为排序器时,就可以调该方法获取。
代码:

import java.util.Arrays;
import java.util.Comparator;
public class Demo06Comparator {
		private static Comparator<String> newComparator() {
		return (a, b) ‐> b.length() ‐ a.length();
	}
			public static void main(String[] args) {
			String[] array = { "abc", "ab", "abcd" };
			System.out.println(Arrays.toString(array));
			Arrays.sort(array, newComparator());
			System.out.println(Arrays.toString(array));
	}
}

三、 常用函数式接口
3.1 supplier接口

public class Spl_01 {
    //定义一个方法,方法的参数传递Supplier<T>接口,泛型执行String,get方法就会返回一个String
    public  static String getString(Supplier<String> sup){
            return sup.get();
    }

    public static void main(String[] args) {
        String s = getString(() -> "我爱JAVA");
        System.out.println(s);
    }
}

3.2 Consumer接口


    /*
    Consumer接口是一个消费型接口,泛型执行什么类型,就可以用accept方法消费什么类型的数据(使用),
    至于怎么消费,需要自定义(输出、计算)。
    */
import java.util.function.Consumer;

public class CS_p {
    public static void method(String[] t, Consumer<String> con1,Consumer<String> con2){
        for (String s : t) {
            con1.andThen(con2).accept(s);
        }

    }

    public static void main(String[] args) {
        String[] t = {"迪丽热巴,女","古力娜扎,女","马儿扎哈,男"};
        method(t,(s) -> System.out.print("姓名:"+s.split(",")[0]+"  "),
                (s -> System.out.println("性别:"+s.split(",")[1])));
    }
}

3.3 Predicate接口
Predicate 接口中包含一个抽象方法: boolean test(T t) 。用于条件判断的场景:

import java.util.function.Predicate;

public class Prd_T {
    public static Boolean methodS(String s, Predicate<String> pre,Predicate<String> pre1){
            return pre.test(s)&&pre1.test(s);
    }

    public static void main(String[] args) {
        String[] str = {"古力娜扎,女","马儿扎哈,男","杰洛特,男","赵丽颖,女"};
        for (String s : str) {
            if ((methodS(s,(s1)-> s1.split(",")[0].length()==4,
                    (s1)->s1.split(",")[1].equals("女")) == true)) {
                System.out.println(s);
            }
        }
    }
}

3.4 Function接口
java.util.function.Function<T,R> 接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,
后者称为后置条件。
Function 接口中最主要的抽象方法为: R apply(T t) ,根据类型T的参数获取类型R的结果。使用的场景例如:将 String 类型转换为 Integer 类型。
代码:

import java.util.function.Function;

public class Fun_03 {
    public static void Pr(String str, Function<String,String> fun,Function<String,Integer> fun1){
        Integer in = fun.andThen(fun1).apply(str);
        System.out.println(in);
    }

    public static void main(String[] args) {
        String s = "赵丽颖,20";
        Pr(s,(s1)-> s1.split(",")[1],
                (s1) -> Integer.parseInt(s1)+100);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44167508/article/details/85942856
今日推荐