Java8新特性-函数式接口

一、函数式接口

1.1 简介

  • 首先的是一个接口
  • 接口内有且只有一个抽象方法
  • 为防止破坏函数式接口,最好是在接口上使用
  • @FunctionalInterface注解修饰

定义一个函数接口

package com.xxx;

@FunctionalInterface
public interface Inner3 {
    //只能有一个抽象方法
    void showInfo();

    default void show() {
    }
}

1.1.1 函数接口作为方法的参数
1.1.2 函数接口作为方法的返回值
1.1.3 jdk提供的函数型接口作为方法的参数

1.2 供给型接口-Supplier

方法名称 方法描述
T get() 得到一个结果
package com.xxx;

import java.util.function.Supplier;

public class SupplierTest {
    public static void main(String[] args) {
        String str = getStr(() -> {
            return "函数式接口Supplier".substring(0, 1);
        });

        System.out.println(str);
    }

    public static String getStr(Supplier<String> supplier){
        return supplier.get();
    }
}

1.3 消费型接口-Consumer

方法名称 方法描述
void accept(T t) 提供一个消费的方法
default Consumer andThen(Consumer<? super T> after) 连接多个消费型接口
package com.xxx.lambda.function;

import java.util.function.Consumer;

public class ConsumerTest {
    public static void main(String[] args) {
        showInfo("函数式接口-消费型-Consumer",(String con) -> {
            System.out.println(con.substring(0, 1));
        });
    }

    public static void showInfo(String s, Consumer<String> con) {
        con.accept(s);
    }
}

package com.xxx.lambda.function;

import java.util.function.Consumer;

public class ConsumerTest2 {
    public static void main(String[] args) {
        getStr("asdfgQWERTY",(String con1) -> {
            
        },(String con2) -> {

        });
    }

    public static void getStr(String s, Consumer<String> consumer1, Consumer<String> consumer2){
        //andThen连接多个消费型接口
        //accept提供一个消费的方法
        consumer1.andThen(consumer2).accept(s);
    }
}

1.4 断言型接口-Predicate

方法名称 方法描述
default Predicate and(Predicate<? super T> other) 并且&&
default Predicate negate() 非!
default Predicate or(Predicate<? super T> other) 或者
boolean test(T t) 用于判断
package com.xxx.test01;

import java.util.function.Predicate;

public class PredicateTest {
    public static void main(String[] args) {
        boolean flag = isFlag("最靓的仔", (String s) -> {
            return s.length() > 5;
        });

        System.out.println(flag);
    }

    public static boolean isFlag(String s, Predicate<String> pre){
        return pre.test(s);
    }
}

package com.xxx;

import java.util.function.Predicate;

/**
 * 使用断言型接口判断字符串长度是否大于5 并且字符串中是否包含“歌”
 */
public class PredicateTest2 {
    public static void main(String[] args) {
        boolean flag = isFlag("他想高歌一首", (String p1) -> {
            return p1.length() > 5;
        }, (String p2) -> {
            return p2.contains("歌");
        });

        System.out.println(flag);
    }

    public static boolean isFlag(String s, Predicate<String> p1, Predicate<String> p2) {
        return p1.negate().test(s);
    }
}

package com.xxx;

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

/**
 * 使用断言型接口判断 String[] ss={"迪丽热巴","古力娜扎","马尔扎哈"}
 * 将数组中元素满足两个条件 元素字符长度==4 元素中"迪"存入集合中
 */
public class PredicateTest3 {
    public static void main(String[] args) {
        String[] ss={"迪丽热巴","古力娜扎","马尔扎哈"};

        List<String> list = showInfo(ss, (String s1) -> {
            return s1.length() == 4;
        }, (String s2) -> {
            return s2.contains("迪");
        });
        System.out.println(list);
    }

    public static List<String> showInfo(String[] arrays, Predicate<String> pre1, Predicate<String> pre2) {
        List<String> list = new ArrayList<>();

        for (String array : arrays) {
            if (pre1.and(pre2).test(array)) {
                list.add(array);
            }
        }

        return list;

    }
}

1.5 函数型接口-Function

方法名称 方法描述
default Function<T,V> andThen(Function<? super R,? extends V> after) 用于连接多个函数型接口
R apply(T t) 用于来进行转换
package com.xxx;

import java.util.function.Function;

/**
 * 使用Function将字符串转换为整数类型
 */
public class FunctionTest {
    public static void main(String[] args) {
        Integer in = showInfo("123", (String s) -> {
            return Integer.parseInt(s);
        });
        System.out.println();
    }

    public static Integer showInfo(String s, Function<String, Integer> fun) {
        return fun.apply(s);
    }
}

package com.xxx;

import java.util.function.Function;

/**
 * 使用Function将字符串转换为整数类型 再将整数类型转换为字符串类型
 */
public class FunctionTest2 {
    public static void main(String[] args) {
        String s = showInfo("123", Integer::parseInt, (Integer i2) -> {
            return i2 + "";
        });
        System.out.println(s);

    }

    public static String showInfo(String s, Function<String, Integer> fun1, Function<Integer,String> fun2) {
        return fun1.andThen(fun2).apply(s);
    }
}

posted @ 2022-10-26 20:45  Rix里克斯  阅读(59)  评论(0)    收藏  举报