zoukankan      html  css  js  c++  java
  • java函数式接口

    一 简介

      函数式接口简单理解就是把方法可以作为对象传递操作。

      之前需要传递方法一般都是两种方式,

      一种方式是使用匿名类,最常见的就是集合的排序方法sort经常被传入一个用于排序比较的匿名类。

      另一种方式就是使用策略模式,把实现了策略接口的对象作为方法传递。

      现在java的函数式接口和lambda表达式丰富并简化了方法的传递。

    二 使用

      在接口上添加@FunctionalInterface声明使它成为函数式接口

       函数式接口只允许有一个抽象方法(很显然,这就是那个要被传递使用的方法)

      例如我们可以这样创建一个函数式接口:

    @FunctionalInterface
    public interface Function<T, R> {
    
        R apply(T t);
    }

    创建对象时可以使用lambda表达式创建,例如:

    Function fuc = (x) -> { x.length() }

    其他方法就可以通过接收接口参数执行接收到的方法。

    例如操作集合常用的java.lang.Iterable 的 foreach方法中就被要求传入一个实现了内置函数式接口Consumer的实例对象:

    default void forEach(Consumer<? super T> action) {
            Objects.requireNonNull(action);
            for (T t : this) {
                action.accept(t);
            }
        }

    如下代码就是利用foreach方法把list中的所有元素输出至控制台。foreach()括号内的代码其实就是创建了一个函数式接口Consumer的实例对象

    list.forEach((x)->System.out.println(x));

    三 java内置常用函数式接口

      除了上面提到的Consumer外,java还有Supplier等其他接口,全都在java.util.function包内,他们的主要区别就是抽象方法的参数和返回值的数量以及类型不一样。

    四 lambda 表达式中的双冒号::

      使用双冒号可以更方便的从已有类或对象中创建出函数式接口的对象

      例如上述foreach的代码就可以简写成list.forEach(System.out::println);

      双冒号共有四种使用方法:

          对象::实例方法

          类::实例方法

          类::静态方法

          类:new

  • 相关阅读:
    滑雪,不亦乐乎
    quant
    分享:Comment Remover 0003 发布
    shit 牛人要么出国了,要么在出国的路上
    linux目录跳转快捷方式——z武器
    迷你双核RK3066 安卓4.1智能网络高清TV 安卓播放器MK802III淘宝网
    分享:每天40分钟家务
    Marios Hadjieleftheriou/Frequent Items: Evaluation Source Code
    urllib2源码解读四(用opener打开你的url)
    分享:Editra 0.7.20 发布,跨平台文本编辑器
  • 原文地址:https://www.cnblogs.com/uip001/p/14741658.html
Copyright © 2011-2022 走看看