zoukankan      html  css  js  c++  java
  • Java 8 函数式编程

    • Lambda表达式
    λ表达式本质上是一个匿名方法。让我们来看下面这个例子:
    
    public int add(int x, int y) {
        return x + y;
    }
    转成λ表达式后是这个样子:
    (int x, int y) -> x + y;

    λ表达式的类型,叫做“目标类型(target type)”。λ表达式的目标类型是“函数接口(functional interface,FI)”,这是Java8新引入的概念。

    它的定义是:一个接口,如果只有一个显式声明的抽象方法,那么它就是一个函数接口。一般用@FunctionalInterface标注出来(也可以不标)。

    我们常见的Runable、Comparable等都算是FI。注意这里的显示声明只的是在这个接口里面声明,比如说继承自Object中的方法就不算显示声明的方法。
    需要记住的一件事是:默认方法与静态方法并不影响函数式接口的契约,可以任意使用:

    你可以用一个λ表达式为一个函数接口赋值:
    Runnable r1 = () -> {System.out.println("Hello Lambda!");};
    Runnable r1 = () -> {System.out.println("Hello Lambda!")}; //只有一条语句的时候可以省略一个分号。
    •  lambda表达式通常以(argument)->(body)的格式,其中argument表示抽象方法的参数,body是抽象方法实现的函数体的内容
      (Type1 arg1,Type2 arg2...)->{body}
      //参数类型可以省略
      (arg1,arg2...) -> {body}
      • 参数可以是零个或多个
      • 参数类型可指定,可省略(根据表达式上下文推断)
      • 参数包含在圆括号中,用逗号分隔
      • 表达式主体可以是零条或多条语句,包含在花括号中
      • 表达式主体只有一条语句时,花括号可省略
      • 表达式主体有一条以上语句时,表达式的返回类型与代码块的返回类型一致
      • 表达式只有一条语句时,表达式的返回类型与该语句的返回类型一致

        Java8 API中新增了许多函数式接口:
      • 函数式接口函数描述符原始类型特化
        Predicate<T> T -> boolean IntPredicate, LongPredicate, DoublePredicate
        Consumer<T> T -> void IntConsumer, LongConsumer, DoubleConsumer
        Function<T,R> T -> R IntFunction<R>, IntToDoubleFunction, IntToLongFunction, LongFunction<R>, LongToDoubleFunction, LongToIntFunction, DoubleFunction<R>, ToIntFunction<T>, ToDoubleFunction<T>, ToLongFunction<T>
        Supplier<T> () -> T BooleanSupplier, IntSupplier, LongSupplier, DoubleSupplier
        UnaryOperator<T> T -> T IntUnaryOperator, LongUnaryOperator, DoubleUnaryOperator
        BinaryOperator<T> (T,T) -> T IntBinaryOperator, LongBinaryOperator, DoubleBinaryOperator
        BiPredicate<L,R> (L,R) -> boolean  
        BiConsumer<T,U> (T,U) -> void ObjIntConsumer<T>, ObjLongConsumer<T>, ObjDoubleConsumer<T>
        BiFunction<T,U,R> (T,U) -> R ToIntBiFunction<T,U>, ToLongBiFunction<T,U>, ToDoubleBiFunction<T,U>
     
       就是说任何可以接受一个FI实例的地方,都可以用Lambda表达
     
  • 相关阅读:
    webapi之fiddler头设置
    ios---setContentOffset
    webapi参数处理get过个参数
    socket网络编程
    logging模块
    configparser模块(拷贝)
    hashlib模块--摘要算法
    异常处理
    面向对象拓展
    反射
  • 原文地址:https://www.cnblogs.com/Coder-Pig/p/6688888.html
Copyright © 2011-2022 走看看