• Java8-四个函数式接口(Consumer,Supplier,Predicate,Function)


    Java8---函数式接口

    • Consumer---消费者(accept方法,Lambda与方法引用返回都是Consumer)

    • Supplier---供给型(get方法,返回数据,与Optional可以联用)

    • Predicate---谓词性(test方法,起到判断作用,)

    • Function---功能性(apply方法,转换数据)

    公司代码中看到过很多次Consumer和Function,一直搞不懂,今天做个整理,分成了匿名类,Lambda和方法引用

    1.Consumer消费者
    package Java;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.function.Consumer;
    import java.util.stream.Stream;
    
    /**
     * @ProjectName: Consumer_Test
     * @Package: Java
     * @Description: 消费者---Lambda和方法引用返回都是Consumer
     * @Author: huyuqiao
     * @CreateDate: 2020/9/18 18:10
     */
    /*① Consumer是一个接口,并且只要实现一个 accept 方法,就可以作为一个**“消费者”**输出信息。 ② 其实,lambda 表达式、方法引用的返回值都是 Consumer 类型,所以,他们能够作为 forEach 方法的参数,并且输出一个值。*/
    public class Consumer_Test {
        public static void main(String[] args){
            //匿名内部类
            Consumer<String> consumer = new Consumer<String>() {
                @Override
                public void accept(String s) {
                    System.out.println(s);
                }
            };
            List list = new ArrayList();
            Stream<String> stream = Stream.of("aaa", "bbb", "ccc", "ddd");
            stream.forEach(consumer);
    
            System.out.println("********************");
    
            //Lambda
            stream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff");
            Consumer<String> consumer1 = s -> System.out.println(s);
            stream.forEach(consumer1);
            System.out.println("********************");
    
            //方法引用
            stream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff");
            Consumer consumer2 = System.out::println;
            stream.forEach(consumer);
        }
    }
    
    
    2.Supplier供应者
    package Java;
    
    import com.sun.org.apache.bcel.internal.generic.NEW;
    
    import javax.swing.text.html.Option;
    import java.util.Optional;
    import java.util.Random;
    import java.util.function.Supplier;
    import java.util.stream.Stream;
    
    /**
     * @ProjectName: Supplier_Test
     * @Package: Java
     * @Description: 供给型-配合optional
     * @Author: huyuqiao
     * @CreateDate: 2020/9/18 18:47
     */
    /*① Supplier 接口可以理解为一个容器,用于装数据的。 ② Supplier 接口有一个 get 方法,可以返回值。
    */
    public class Supplier_Test {
        public static void test_Supplier2(){
            Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
            Optional<Integer> first = stream.filter(integer -> integer > 6).findFirst();
            //orElse,如果first中存在数,就返回这个数,如果不存在,就放回传入的数
            System.out.println(first.orElse(777));
    
            System.out.println("********************");
            Supplier<Integer> supplier = new Supplier<Integer>() {
                @Override
                public Integer get() {
                    return new Random().nextInt();
                }
            };
            //orElseGet,如果first中存在数,就返回这个数,如果不存在,就返回supplier返回的值
            System.out.println(first.orElseGet(supplier));
    
        }
    
        public static void test_Supplier(){
            Supplier<Integer> supplier = new Supplier<Integer>() {
                @Override
                public Integer get() {
                    return new Random().nextInt();
                }
            };
            System.out.println(supplier.get());
    
            System.out.println("********************");
    
            supplier = () -> new Random().nextInt();
            System.out.println(supplier.get());
    
            System.out.println("********************");
            Supplier<Double> supplier1 = Math::random;
            System.out.println(supplier1.get());
        }
    
        public static void main(String[] args){
            test_Supplier2();
    
        }
    }
    
    
    3.Predicate谓词性
    package Java;
    
    import java.util.function.Predicate;
    
    /**
     * @ProjectName: Predicate_Test
     * @Package: Java
     * @Description: 谓词型-判断
     * @Author: huyuqiao
     * @CreateDate: 2020/9/18 19:02
     */
    /*① Predicate 是一个谓词型接口,其实只是起到一个判断作用。 ② Predicate 通过实现一个 test 方法做判断。*/
    public class Predicate_Test {
        public static void main(String[] args){
            Predicate<Integer> predicate = new Predicate<Integer>() {
                @Override
                public boolean test(Integer integer) {
                    if (integer > 5){
                        return true;
                    } else {
                        return false;
                    }
                }
            };
    
            System.out.println(predicate.test(6));
    
            System.out.println("********************");
    
            predicate = integer -> integer > 5;
            System.out.println(predicate.test(5));
        }
    }
    
    
    4.Function功能性
    package Java;
    
    import java.util.function.Function;
    import java.util.stream.Stream;
    
    /**
     * @ProjectName: Function_Test
     * @Package: Java
     * @Description:
     * @Author: huyuqiao
     * @CreateDate: 2020/9/18 19:12
     */
    /*① Function 接口是一个功能型接口,是一个转换数据(求长度,大小等)的作用。 ② Function 接口实现 apply 方法来做转换。
    */
    public class Function_Test {
        public static void main(String[] args){
            Function<String, Integer> function = new Function<String, Integer>() {
                @Override
                public Integer apply(String s) {
                    return s.length();
                }
            };
            Stream<String> stream = Stream.of("aaa", "bbbbb", "ccccccv");
            Stream<Integer> stream1 = stream.map(function);
            stream1.forEach(System.out::println);
        }
    }
    
    
  • 相关阅读:
    js 获取当前年月日
    Pycharm设置python文件头
    vert.x快速入门
    Java中List<T>和List<?>的区别【转载】
    jdk8 时间
    Pycharm快捷键设置(鼠标滚动控制字体大小)
    IaaS、PaaS和SaaS:云计算的三种服务模式 【转】
    Ruby on rails Mac开发 入门笔记(一)
    用Ruby批量获取电影的评分与影片信息
    猜猜博客园最热门的标签
  • 原文地址:https://www.cnblogs.com/meditation5201314/p/13693089.html
Copyright © 2020-2023  润新知