zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    
    
  • 相关阅读:
    XAF 有条件的对象访问权限
    XAF 顯示 UnInplace Report(設置自定義條件顯示報表,不是根據選擇ListView記錄條件顯示報表)
    XAF 如何自定义PivotGrid单元格显示文本?
    XAF 如何布局详细视图上的按钮
    XAF How to set size of a popup detail view
    XAF Delta Replication Module for Devexpress eXpressApp Framework
    XAF 帮助文档翻译 EasyTest Basics(基础)
    XAF 用户双击ListView记录时禁止显示DetailView
    XAF How to enable LayoutView mode in the GridControl in List Views
    XAF 如何实现ListView单元格批量更改?
  • 原文地址:https://www.cnblogs.com/meditation5201314/p/13693089.html
Copyright © 2011-2022 走看看