zoukankan      html  css  js  c++  java
  • Java8函数式接口和Lambda表达式

    两者关系:

    Lambda表达式就是函数式接口(FunctionalInterface)实现的快捷方式,它相当于函数式接口实现的实例,因为在方法中可以使用Object作为参数,所以把Lambda表达式作为方法的参数也是可以的。

     

    函数式接口只有一个抽象方法,并且没有重写Object类中的方法(Object类中的public的方法除外),可以有默认方法和静态方法。(即有且只有一个抽象方法的接口)

    函数式接口一般用注解@FunctionalInterface标注。

    例子:

    1、声明一个函数式接口

    @FunctionalInterface
    public interface Calculator { double calculate(int a, int b); }

    2、使用Lambda表达式(参数类型可省略) 

    Calculator division  = (int a, int b) -> (double) a / b;
    System.out.println(division.calculate(5, 2)); // prints 2.5

    另一个例子(使用jdk标准库内的函数式接口,下滑至文末查看更多):

    Function<Integer, Integer> selfIncrease = x -> x + 1;
    Function<Integer, Integer> twiceValue = x -> 2*x;
    Consumer<Integer> printNum = x -> System.out.println("2x+1:"+selfIncrease.apply(x)); 
    
    int [] numbers= {1, 2, 3};
    Arrays.stream(numbers).boxed().map(twiceValue).forEach(printNum);
    System.out.println("通过表达式后的数组:"+Arrays.toString(numbers));

    输出:

    2x+1:3

    2x+1:5

    2x+1:7

    通过表达式后的数组:[1, 2, 3]

     

    3、使用Lambda表达式作为方法参数

    public static void main(String[] args) throws Exception {
            execute(a -> String.valueOf(a + 1), 10);
        }
    
        public static void execute(Function<Integer, String> func, int num) {
            System.out.println(func.apply(num));
        }

    4、问题

    • 标准库内没有提供支持更多参数的函数式接口
    • lambda表达式中引用到的变量需要实际是final
    // 编译通过
    public static void main(String[] args) throws Exception {
        int num = 10;
        Function<Integer, Integer> lambda = x -> x + num;
    }
    
    // 编译错误
    public static void main(String[] args) throws Exception {
        int num = 10;
        num += 1;
        Function<Integer, Integer> lambda = x -> x + num;
    }

     5、函数式接口

    http://www.cnblogs.com/IcanFixIt/p/4284418.html

    函数式接口

    描述

    Function

    传递一个参数返回一个结果。这个结果的类型可以与参数的类型不相同。

    BiFunction

    传递两个参数返回一个结果。这个结果的类型可以与任一参数的类型不相同。

    UnaryOperator

    代表一个操作符的操作,它的返回结果类型与操作符的类型一样。实际上它可以被看作是Function 它的返回结果跟参数一样,它是Function 的子接口。

    BiOperator

    代表两个操作符的操作,它的返回结果类型必须与操作符相同。

    Predicate

    传递一个参数,基于参数的值返回boolean值。

    Supplier

    代表一个供应者的结果。

    Consumer

    传递一个参数但没有返回值。

    具体使用可以查看jdk源码里的抽象方法的方法返回值,方法参数,以及函数式接口定义说明。

    参考:

    http://www.cnblogs.com/IcanFixIt/p/4284418.html

    http://blog.soliloquize.org/2015/07/07/Java-8%E4%B8%AD%E7%9A%84%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B%E4%B8%80/

  • 相关阅读:
    C#获取上级文件夹路径
    C#string与byte数组转行
    C#BAT与VBS文件的创建和执行调用
    C#生成条形码
    C#根据生日计算所属十二星座
    C#获取某一字符串第N到第N+1空格的字符
    WPF的DataGrid表格动态加载合并列
    WPF递归设置CheckBox与TextBox禁用联动
    WPF基础知识
    WPF Popup绑定目标控件上下左右位置
  • 原文地址:https://www.cnblogs.com/goingforward/p/8043590.html
Copyright © 2011-2022 走看看