zoukankan      html  css  js  c++  java
  • Java8 函数式接口 @FunctionalInterface以及常用Consumer<T>、Supplier<T>、Function<T, R>、Predicate<T>总结

    首先看看什么是Lambda 表达式

    Lambda是一个匿名函数,我们可以把Lambda表达式理解为一段可以传递的代码(将代码像数据一样传递);最简单的Lambda表达式可由逗号分隔的参数列表、->符号和语句块组成,例如:

    Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );
    

    如果 ->后面的语句块有多句就使用 { } 例如:

            Arrays.asList("a", "b", "d").forEach(i -> {
                if ("a".equals(i)) {
                    System.out.println(i);
                }
            });
    

    @FunctionalInterface 注解 标识是一个函数式接口

    1、该注解只能标记在"有且仅有一个抽象方法"的接口上。
    2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。
    3、接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。
    4、该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。

    函数式接口创建三种方式

    1、lambda表达式
    2、方法引用
    3、构造方法引用

    Java8中强制申明的常用函数式接口

    Runnable、Callable、Comparator、Consumer、Supplier、Function<T, R>、Predicate

    java.util.function包中常用接口

    2fcfcc5f3de2692318f04235ea51f79.png

    Function<T, R>接口

    Function 接口是一个功能型接口,是一个转换数据的作用。接收一个T参数,返回一个R结果
    Function 接口实现 apply 方法来做转换。
    Stream 类的 map 方法了,map 方法传入一个 Function 接口,返回一个转换后的 Stream类

        public static void main(String[] args) {
            //使用map方法,泛型的第一个参数是转换前的类型,第二个是转化后的类型
            Function<String, Integer> function = s -> {
                System.out.println("获取字符串" + s + "的长度");
                return s.length();
            };
    
            Stream<String> stream = Stream.of("sada", "dfg", "12");
            Stream<Integer> stream1 = stream.map(function);
            stream1.forEach(System.out::println);
        }
    

    Consumer接口

    消费型接口,接收一个参数,并处理,不返回

        public static void main(String[] args) {
            Consumer<Integer> consumer = i -> {
                System.out.println("Consumer 接收 参数 i 开始处理");
                int step = 1;
                System.out.printf("Consumer 输入%d, 输出%d%n", i, i + step);
            };
    
            List<Integer> list = Arrays.asList(4, 2, 6);
            list.forEach(consumer);
        }
    

    Predicate接口

    Predicate 接口是一个谓词型接口,是一个类似于 bool 类型的判断的接口。接收一个T类型参数,返回一个bool值

    Stream的filter接口参数为Predicate<? super T>

        public static void main(String[] args) {
    
            //将Predicate作为filter接口,Predicate起到一个判断的作用
            Predicate<Integer> predicate = integer -> integer > 4;
    
            Stream<Integer> stream = Stream.of(1,3,2,4,5,12,13);
            List<Integer> list = stream.filter(predicate).collect(Collectors.toList());
            list.forEach(System.out::println);
    
        }
    

    Supplier接口

    生产者接口,没有参数,返回一个T类型的结果。
    1、Supplier 接口可以理解为一个容器,用于装数据的。
    2、Supplier 接口有一个 get 方法,可以返回值。

    Optional中的 orElseGet 方法的参数就是Supplier<? extends T>

            Stream<Integer> stream = Stream.of(1, 2, 3, 4);
            //返回一个optional对象
            Optional<Integer> first = stream.filter(i -> i > 4)
                    .findFirst();
    
            //optional对象有需要Supplier接口的方法
            //orElse,如果first中存在数,就返回这个数,如果不存在,就放回传入的数
            System.out.println(first.orElse(1));
            System.out.println(first.orElse(7));
    
            Supplier<Integer> supplier = new Supplier<Integer>() {
                @Override
                public Integer get() {
                    //返回一个随机值
                    return new Random().nextInt();
                }
            };
    
            //orElseGet,如果first中存在数,就返回这个数,如果不存在,就返回supplier返回的值
            System.out.println(first.orElseGet(supplier));
    
  • 相关阅读:
    366. Find Leaves of Binary Tree输出层数相同的叶子节点
    716. Max Stack实现一个最大stack
    515. Find Largest Value in Each Tree Row查找一行中的最大值
    364. Nested List Weight Sum II 大小反向的括号加权求和
    156. Binary Tree Upside Down反转二叉树
    698. Partition to K Equal Sum Subsets 数组分成和相同的k组
    244. Shortest Word Distance II 实现数组中的最短距离单词
    187. Repeated DNA Sequences重复的DNA子串序列
    java之hibernate之基于主键的双向一对一关联映射
    java之hibernate之基于主键的单向一对一关联映射
  • 原文地址:https://www.cnblogs.com/monkjavaer/p/15708367.html
Copyright © 2011-2022 走看看