Java8之函数式接口

一、简介:

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式。

二、代码举例:

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @author :gongxr
 * @description:函数式接口用法举例(FunctionalInterface)
 * 只包含一个抽象方法的接口,称为函数式接口。
 * 可以通过Lambda表达式来创建该接口的对象。
 * 在任意函数式接口上使用@FunctionalInterface注解,javadoc会包含函数式接口的声明。
 */
public class FunctionalInterfaceDemo {

    /**
     * 自定义函数式接口
     */
    @FunctionalInterface
    interface MyFun {
        int fun(int a, int b);
    }

    public int doSomething(int a, int b, MyFun myFun) {
        return myFun.fun(a, b);
    }

    @Test
    public void testFunctionalInterface() {
        int n = doSomething(1, 2, (x, y) -> {
            int sum = x + y;
            return sum;
        });
        System.out.println("fun() -> " + n);
    }

    /**
     * 1.Consumer<T> : 消费型接口,void accept(T t);
     * 接受一个输入参数并且无返回的操作
     */
    @Test
    public void test() {
        happy(10000, (m) -> System.out.println("大保健花了:" + m));
    }

    public void happy(double money, Consumer<Double> con) {
        con.accept(money);
    }

    /**
     * 2.Supplier<T> : 供给型接口,T get();
     * 无参数,返回一个结果。
     */
    @Test
    public void test1() {
        List<Integer> numList = getNumList(10, () -> (int) (Math.random() * 100));
        for (Integer integer : numList) {
            System.out.println(integer);
        }
    }

    //          需求:产生指定个数的整数,并放入集合中
    public List<Integer> getNumList(int num, Supplier<Integer> sup) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < num; i++) {

            Integer n = sup.get();
            list.add(n);

        }
        return list;
    }

    /**
     * 3.Function<T, R> : 函数型接口,R apply(T t);
     * 接受一个输入参数,返回一个结果。
     */
    @Test
    public void test2() {
        String trimStr = strHandler("\t\t  你好,world!   ", (str) -> str.trim());
        System.out.println(trimStr);


        String sumString = strHandler("Helloworld!", (str) -> str.substring(2, 4));
        System.out.println(sumString);
    }

    //      需求:用于处理字符串
    public String strHandler(String str, Function<String, String> fun) {
        return fun.apply(str);
    }

    /**
     * 4.Predicate<T> : 断言型接口,boolean test(T t);
     * 接受一个输入参数,返回一个布尔值结果。
     */
    @Test
    public void test3() {
        List<String> list = Arrays.asList("Hello", "world", "hi", "o", "123");
        List<String> filterStr = filterStr(list, (str) -> str.length() > 1);
        for (String string : filterStr) {
            System.out.println(string);
        }
    }

    //      需求:将满足条件的字符串,放入集合中
    public List<String> filterStr(List<String> list, Predicate<String> pre) {
        List<String> list2 = new ArrayList<>();
        for (String str : list) {
            if (pre.test(str)) {
                list2.add(str);
            }
        }
        return list2;
    }

}

 

posted @ 2021-03-10 14:28  星瑞  阅读(218)  评论(0编辑  收藏  举报