函数式接口

112 阅读3分钟

 什么是函数式接口

  • 只包含一个抽象方法的接口,称为函数式接口。
  • 你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。
  • 我们可以在任意函数式接口上使用 @FunctionalInterface 注解, 这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包 含一条声明,说明这个接口是一个函数式接口。

自定义函数式接口

image.png

 代码
package com.www.java8.inter;

/**
 * 函数式接口
 * <p>
 *
 * @author Www
 * <p>
 * 邮箱: 483223455@qq.com
 * <p>
 * 创建时间: 2022/8/11  18:27  星期四
 * <p>
 */
@FunctionalInterface
public interface MyFun<T> {
    /**
     * 获取传入的参数
     *
     * @param t
     * @return
     */
    public Integer getValue(Integer t);
}

 作为参数传递Lambda 表达式

image.png

作为参数传递 Lambda 表达式:为了将 Lambda 表达式作为参数传递,接 收Lambda 表达式的参数类型必须是与该 Lambda 表达式兼容的函数式接口 的类型。

Java 内置四大核心函数式接口

image.png

其他接口

image.png

 代码演示

package com.www.java8.test;

import org.testng.annotations.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * Java8  内置的四大核心函数式接口
 * <p>
 * Consumer<T> :消费型接口
 * void accept(T t);
 * <p>
 * Supplier<T> :供给型接口
 * T get();
 * <p>
 * Function<T, R> :函数型接口
 * R apply(T t);
 * <p>
 * Predicate<T> : 断言型接口
 * <p>
 * boolean test(T t);
 *
 * @author Www
 * <p>
 * 邮箱: 483223455@qq.com
 * <p>
 * 创建时间: 2022/8/11  19:39  星期四
 * <p>
 */
public class Lambda2Test {
    
    /**
     * Consumer<T> 消费型接口 , 有去无回
     */
    @Test
    public void testConsumer() {
        happy(46919, m -> System.out.println("享受生活消费 " + m + "元"));
    }
    
    /**
     * Supplier<T> 供给型 接口
     */
    @Test
    public void testSupplier() {
        List<Integer> numbers = getNumbers(10, () -> (int) (Math.random() * 100));
        numbers.forEach(System.out::println);
        
    }
    
    /**
     * Function<T> 函数型接口
     */
    @Test
    public void testFunction() {
        String wfsdgfasdf = strHandle("\t\t\t\t\twfsdgfasdf             ", String::trim);
        System.out.println(wfsdgfasdf);
        String str = strHandle("\t\t\t\t\twfsdgfasdf 我爱中国sdf", s -> s.substring(s.length() - 7, s.length() - 3));
        System.out.println(str);
    }
    
    
    /**
     * Predicate<T> 断言型接口
     */
    @Test
    public void testPredicate() {
        List<String> list = Arrays.asList("wefasf", "fasdf", "wsdf", "sdf", "sd", "fs");
        List<String> list1 = filterStr(list, s -> s.length() < 3);
        
        list1.forEach(System.out::println);
    }
    
    public List<String> filterStr(List<String> list, Predicate<String> predicate) {
        List<String> strings = new ArrayList<>();
        for (String string : list) {
            if (predicate.test(string)) {
                strings.add(string);
            }
        }
        return strings;
    }
    
    /**
     * 处理字符串
     *
     * @param str
     * @param fun
     * @return
     */
    public String strHandle(String str, Function<String, String> fun) {
        return fun.apply(str);
    }
    
    /**
     * 产生指定个数的整数, 变更放入到集合中
     *
     * @param num
     * @param sup
     * @return
     */
    public List<Integer> getNumbers(int num, Supplier<Integer> sup) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            list.add(sup.get());
        }
        return list;
    }
    
    
    /**
     * 消费
     *
     * @param money
     * @param consumer
     */
    public void happy(double money, Consumer<Double> consumer) {
        consumer.accept(money);
    }
}

package com.www.java8.test;

import com.www.java8.entity.Employee;
import com.www.java8.inter.MyFunction;
import org.testng.annotations.Test;

import java.util.Arrays;
import java.util.List;

/**
 * 练习
 * <p>
 *
 * @author Www
 * <p>
 * 邮箱: 483223455@qq.com
 * <p>
 * 创建时间: 2022/8/11  18:42  星期四
 * <p>
 */
public class LambdaDemo {
    List<Employee> employees = Arrays.asList(
            new Employee("w", 21, 9999.99),
            new Employee("ww", 31, 6666.66),
            new Employee("nw", 31, 6666.66),
            new Employee("lw", 31, 6666.66),
            new Employee("www", 41, 777.66),
            new Employee("l", 1, 5555.555));
    
    /**
     * 先根据 年龄排序, 年龄一样时 ,根据 姓名进行排序
     */
    @Test
    public void test1() {
        employees.sort((e1, e2) -> {
            if (e1.getAge().equals(e2.getAge())) {
                return e1.getName().compareTo(e2.getName());
            } else {
                return Integer.compare(e2.getAge(), e1.getAge());
            }
        });
        for (Employee emp : employees) {
            System.out.println(emp);
        }
    }
    
    /**
     * 处理
     */
    @Test
    public void test2() {
        System.out.println("去除空格:");
        String s = strHandler("\t\t\t 我爱中国", String::trim);
        System.out.println(s);
        
        System.out.println("将字母转换成 大写:");
        String sdfsdf = strHandler("sdfsdf", String::toUpperCase);
        System.out.println(sdfsdf);
        System.out.println("截取字符串:");
        System.out.println(strHandler("wsdfgasdf我爱中国", str -> str.substring(str.length() - 4)));
    
    }
    
    /**
     * 处理字符串
     *
     * @param str
     * @param fun
     * @return
     */
    public String strHandler(String str, MyFunction fun) {
        return fun.getValue(str);
    }
    
}

 MyFunction

package com.www.java8.inter;

/**
 * <p>
 *
 * @author Www
 * <p>
 * 邮箱: 483223455@qq.com
 * <p>
 * 创建时间: 2022/8/11  18:50  星期四
 * <p>
 */
@FunctionalInterface
public interface MyFunction {
    /**
     * 将 str 返回
     *
     * @param str
     * @return
     */
    public String getValue(String str);
}