JDK1.8的四大核心函数式接口

JDK1.8新特性:
四大核心函数式接口:
Consumer<T>接口    消费者接口
Function<T,R>接口  表示接受一个参数并产生结果的函数
Supplier<T>接口    代表结果供应商
Predicate<T>接口   断言接口

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

public class FourInterfaceDemo {

    public static void main(String[] args) {
        //functionTest();
        //supplierTest();
        predicateTest();
    }
    
    
    
    /**
     Function<T,R>接口:
     方法:apply(T)返回 R;且方法需要传参
     因为只有一个抽象方法,所以可以使用lambda表达式实现 
    */
    //如何实现小写字符转大写字母?
    //表示接受一个参数并产生结果的函数
    //(String str)->{} 因为Function<T,R>接口的方法apply需要传入一个参数,所以lambda的()里也需要传入一个参数
    public static void functionTest() {
        String s = strtoUpp("hudechao",(String str)->str.toUpperCase());
        System.out.println(s);
    }
    
    //Function<T,R>的抽象方法,接受T类型,返回R类型
    //把Function<T,R>作为一个参数传入,调用该方法时需要传入Function<T,R>参数时就可以使用到lambda表达式了
    //这里Function<T,R>作为参数并没有具体的实现,所以真正的实现还是在lambda的表达式中
    public static String strtoUpp(String str,Function<String,String> f) {
        return f.apply(str);
    }
    
    
    
    /**
     Supplier<T>接口:
     方法:get() 返回 T;且方法无参
     因为只有一个抽象方法,所以可以使用lambda表达式实现
    */
    //如何实现,输入一个数,获取数个数的随机数?
    public static void supplierTest() {
        List<Integer> list = getNums(10,()->(int)(Math.random() *100));
        list.forEach(System.out::println); //或如下格式遍历
        list.forEach((Integer i)->System.out.println(i));
        
    } 
    //Supplier<T>作为一个参数传入,调用该方法时传入;因此就把lambda的表达式作为他它的变相参数传入
    public static List<Integer> getNums(int num,Supplier<Integer> sup){
        List<Integer> list = new ArrayList<>();
        for(int i=0;i<num;i++) {
            list.add(sup.get());
        }
        return list;
    }
    
    
    /**
     Predicate<>断言接口
     方法:boolean test(T t),需要传入参数T,返回boolean
     因为只有一个抽象方法,所以可以使用lambda表达式实现
    */
    
    public static void predicateTest() {
        List<String> list = Arrays.asList("Larry","Tom","Moe","Jerry");
        List<String> lists=filter(list,(s)->s.contains("o"));
        lists.forEach(System.out::println);//或如下格式遍历
        lists.forEach((String s)->System.out.println(s));
    }
    
    //过滤字符串中是否包含某字符
    public static List<String> filter(List<String> list,Predicate<String> p){
        List<String> results = new ArrayList<>();
        
        for(String s:list) {
            if(p.test(s)) { //测试是否符合要求
                results.add(s);
            }
        }
        return results;
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_34117522/article/details/87073890