Java8 01 Lambda

1、Lambda表达式概述

Lambda表达式是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)

2、Lambda表达式语法

⑴ 操作符

->

该操作符称为Lambda操作符或箭头操作符,它将Lambda分为两个部分:
左半部分:Lambda表达式所需要的参数
右半部分:Lambda表达式要执行的功能(方法体)

⑵ 语法格式

① 无参数,无返回值


() -> System.out.println(“Hello Lambda!”);

② 需要一个参数


(i) -> System.out.println(i);

i -> System.out.println(i);【省略了小括号】

③ 需要两个参数,有返回值


(x, y) -> {return null;};

④ 执行语句只有一条,可以省略大括号


() -> System.out.println(“Hi”);

() -> {System.out.println(“Hi”);};

⑤ 类型推断


(x, y) -> {System.out.println(x + y);};

(int x, int y) -> {System.out.println(x + y);};

    由于参数类型都是由编译器推断得出的,所以在Lambda表达式中无需指定类型,程序依然可以正常被编译
    因为javac会根据程序的上下文,在后台推断出了参数的类型
    Lambda表达式的类型依赖于上下文环境,是由编译器推断出来的,这就是“类型推断”

3、函数式接口

⑴ 概念

只包含一个抽象方法的接口,被称为函数式接口

⑵ 使用场景

可以通过Lambda表达式来创建该接口对象

⑶ FunctionalInterface注解

    可以在函数式接口上使用@FunctionalInterface注解,这样可以检查它是否是一个函数式接口(有且仅有一个抽象方法,否则会报错)
    同时javadoc也会包含一条声明,用以说明该接口是一个函数式接口

4、JDK8提供的四大核心函数式接口

⑴ Consumer

Consumer<T>

消费型接口

抽象方法:
void accept(T t);
传递参数

示例:

 Consumer<String> consumer = (str) -> {System.out.println(str);};
 consumer.accept("Hello!");

⑵ Supplier

Supplier<T>

供给型接口

抽象方法:
T get();
返回值

示例:

Supplier<Integer> supplier = () -> {return 10;};
System.out.println(supplier.get());

⑶ Function

Function<T, R>

函数型接口

抽象方法:
R apply(T t);
传递参数,返回值

示例:

Function<Integer, String> function = (i) -> {return "参数是:" + i;};
System.out.println(function.apply(10));

⑷ Predicate

Predicate<T>

断言型接口

抽象方法:
boolean test(T t);
传递参数,返回判断的结果

示例:

 Predicate<Integer> predicate = (i) -> {return i >= 10;};
 System.out.println(predicate.test(10));

5、其他JDK8提供的函数式接口

⑴ BiFunction

BiFunction<T, U, R>

抽象方法:
R apply(T t, U u);
传递两个参数,返回值

示例:

  BiFunction<Integer, Integer, String> biFunction = (x, y) -> {return "结果为:" + (x + y);};
  System.out.println(biFunction.apply(1, 1));

⑵ UnaryOperator

UnaryOperator<T> extends Function<T, T>

抽象方法:
T apply(T t);
传递参数,返回相应类型的结果

示例:

  UnaryOperator<Integer> unaryOperator = (i) -> {return i + 9;};
  Integer result = unaryOperator.apply(1);
  System.out.println(result);

⑶ BinaryOperator

BinaryOperator<T> extends BiFunction<T,T,T>

抽象方法:
T apply(T t1, T t2);
传递两个相同类型的参数,返回相同类型的返回值

示例:

  BinaryOperator<Integer> biOperator = (x, y) -> {return x + y;};
  Integer result = biOperator.apply(1, 1);
  System.out.println(result);

⑷ BiConsumer

BiConsumer<T, U>

抽象方法:
void accept(T t, U u);
传递两个参数

示例:

  BiConsumer<String, Integer> biConsumer = (s, i) -> {System.out.println(s + i);};
  biConsumer.accept("结果是:",10);

⑸ ToIntFunction

ToIntFunction<T>

抽象方法:
int applyAsInt(T value);
传递参数,返回int类型返回值

示例:

  ToIntFunction<String> toIntFunction = (str) -> {
      try {
          return Integer.parseInt(str);
      } catch (NumberFormatException e) {
          return 0;
      }
  };
  int result = toIntFunction.applyAsInt("10a");
  System.out.println(result);

⑹ ToLongFunction

ToLongFunction<T>

抽象方法:
long applyAsLong(T value);
传递参数,返回long类型返回值

示例:

  ToLongFunction<Long> toLongFunction = (l) -> {return l;};
  long result = toLongFunction.applyAsLong(1L);
  System.out.println(result);

⑺ ToDoubleFunction

ToDoubleFunction<T>

抽象方法:
double applyAsDouble(T value);
传递参数,返回double类型返回值

示例:

  ToDoubleFunction<Double> toDoubleFunction = (d) -> {return Math.PI * d;};
  double result = toDoubleFunction.applyAsDouble(10D);
  System.out.println(result);

⑻ IntFunction

IntFunction<R>

抽象方法:
R apply(int value);
传递int类型参数,返回指定类型返回值

示例:

   IntFunction<String> inFunction = (i) -> {return  String.format("参数为:%d", i);};
   String result = inFunction.apply(10);
   System.out.println(result);

⑼ LongFunction

LongFunction<R>

抽象方法:
R apply(long value);
传递long类型参数,返回指定类型返回值

示例:

  LongFunction<String> longFunction = (l) -> {return String.valueOf(l);};
  String result = longFunction.apply(1L);
  System.out.println(result);

⑽ DoubleFunction

DoubleFunction<R>

抽象方法:
R apply(double value);
传递double类型参数,返回指定类型返回值

示例:

  DoubleFunction<Double> doubleFunction = (d) -> {return Math.E * d;};
  double result = doubleFunction.apply(10);
  System.out.println(result);

6、方法引用,构造引用和数组引用

⑴ 方法引用

⒈ 概念

如果传递给Lambda表达式的方法已经有实现了,则可以使用方法引用

⒉ 语法

使用操作符 :: 将对象名或类名与方法名分割开

三种情况:
对象(变量名)::实例方法名
类名::静态方法名
类名::实例方法名

⒊ 示例

① 对象::实例方法名

  System.out::println
    即
  (x) -> System.out.println(x)

② 类名::静态方法名

  Integer::sum

   /**
     * @since 1.8
     */
    public static int sum(int a, int b) {
        return a + b;
    }

③ 类名::实例方法名

  String::compareTo

public int compareTo(String anotherString) {}

⑵ 构造引用

⒈ 概念


在创建对象的时候,可以通过构造引用来实现

⒉ 语法

类名::new

⒊ 示例

  Function<String, Person> person = Person::new;
    即
  Function<String, Person> function = (name) -> {return new Person(name);};

 【Person】
    public class Person {
        private String name;
        public Person(String name) {
            this.name = name;
        }
    }

⑶ 数组引用

⒈ 语法

    类型[]::new

⒉ 示例

    Function<Integer, String[]> array = String[]::new;
      即
    Function<Integer, String[]> function = (len) -> {return new String[len];};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值