课程学习--JavaSE--后端(第9期):Java8新特性--Lambda表达式

Java8新特性–Lambda表达式

Lambda表达式的本质就是一个匿名函数,利用Lambda表达式可以把函数作为参数传递进方法中。之所以将其命名为Lambda,是因为其原理涉及Lambda演算。

基础语法

lambda 表达式的语法格式如下:

() -> /* 表达式 */ expression
() -> { /* 语句 */ statements; }
parameter -> expression
parameter -> { statements; }
(parameters) -> expression
(parameters) ->{ statements; }

以下是lambda表达式的重要特征:

  • **可选类型声明:**不需要声明参数类型,编译器可以统一识别参数值。
  • **可选的参数圆括号:**一个参数无需定义圆括号,但多个参数需要定义圆括号,用逗号隔开。
  • **可选的大括号:**如果主体包含了一个语句,就不需要使用大括号,甚至不需要return关键字。
  • **可选的返回关键字:**如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
实例
/**
 * 排序
 */
List<Integer> list = Arrays.asList(5, 4, 3, 2, 1, 6);
/**
 * public static <T> void sort(List<T> list, Comparator <? super T> c) {
 *     list.sort(c);
 * }
 */
Collections.sort(
    list,
    (x, y) -> {
        // 内部迭代
        System.out.println(x + ":" + y + "=" + x.compareTo(y));
        return x.compareTo(y);
        // 倒序
        // return -Integer.compare(x, y);
    }
);

函数式接口

函数式接口,接口中只有一个抽象方法的接口,并使用@FunctionalInterface修饰。

package cn.charliejohn.service;

@FunctionalInterface
public interface StrTool {
    public String getValue(String str);
}

@FunctionalInterface
public interface StrToolPlus<T, R> {
    public R getValue(T tOne, T tTwo);
}
四大核心函数式接口
函数式接口参数类型返回类型用 途
Consumer消费型接口Tvoid对类型为T的对象应用操作,包含方法void accept(T t)
Supplier供给型接口T返回类型为T的对象,包含无参方法T get();
Function<T, R>函数型接口TR对类型为T的对象应用操作,并返回结果。结果是R类型的对象。包含方法R apply(T t)
Predicate断定型接口Tboolean确定类型为T的对象是否满足某约束,并返回Boolean值,包含方法Boolean test(T t)
实例
// Consumer
Consumer<String> consumer = System.out::println;
consumer.accept("hello");

// Supplier
Supplier<String> stringSupplier = String::new;
String suppliertr = stringSupplier.get();
System.out.println(suppliertr.getClass());

// Function
Function<String, String> stringFunction = String::new;
String str = stringFunction.apply("hello");
System.out.println(str);

// Predicate
public static void main(String[] args) {
    System.out.println(filterStr("hi", s -> s.length() > 3));
}
public static String filterStr(String string, Predicate<String> predicate) {
    return predicate.test(string) ? string : "pass";
}

方法引用与构造器引用

方法引用

若Lambda体中的内容有方法已经实现,可以使用方法引用。

语法格式
  1. obj::method
  2. ClassName::static
  3. ClassName::method

注意:

  1. 第一个参数是实例方法的调用者,第二个是实例方法的参数可以用ClassName::method!
实例
/**
 * obj::method
 */
Consumer<String> consumer = System.out::println;
consumer.accept("hello");

/**
 * ClassName::static
 */
Comparator<Integer> comparator = Integer::compare;

/**
 * ClassName::method
 * 返回Boolean
 */
BiPredicate<String, String> biPredicate = String::equals;
构造器引用

ClassName::new

实例
/**
 * ClassName::method
 */
Function<String, String> stringFunction = String::new;
String str = stringFunction.apply("hello");
System.out.println(str);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

charliejohn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值