Java之Lambda表达式和函数式接口

Lambda表达式是一个可传递的代码块,可以在以后执行一次货多次。

(String first, String second) -> first.length() - second.length();

(String first, String second) ->
{
    if ( fisrt,length() < second.length() ) return -1;
    else if( fisrt.length() > second.length() ) return 1;
    else return 0;
}

() -> { for (int i=0; i<10; i++) System.out.println(i); }

// 如果可以推导出参数类型,则可以省略
Comparator<String> cmp = (fisrt, second) -> first.length() - second.length();

// 如果方法只有一个参数,且参数类型可被推导出
ActionListener listener = event -> System.out.println(event);

// 函数式接口
Arrays.sort( persons,
   (p1, p2) -> p1.salary - p2.salary );

供应者,实现懒计算

LocalDate hireDay = Objects.requireNonNullOrElse(day, new LoacalDate(1970,1,1));
// 非最优。如果day很少为null,则希望旨在必要时才构造默认的LocalDate

LocalDate hireDay = Pbjects.requireNonNullOrElse(day,
                            () -> new LocalDate(1970,1,1));

方法引用

当 Lambda 表达式的体只调用一个方法而不做其他操作时,才能把 Lambda 表达式重写为方法应用

var timer = new Timer(1000, event -> System.out.println(event) );
var timer = new Timer(1000, System.out::println );

Arrays.sort(words, String::compareToIgnoreCase);

// 以下有一个方法调用,但此外还有一个比较。因此不能使用方法调用
s -> s.length() == 0
处理Lambda

使用Lambda 表达式的重点是延迟执行

如果需要立即执行代码,完全可以直接执行

之所以希望以后再执行代码,原因如下:

  1. 在一个单独的线程中运行代码
  2. 多次运行代码
  3. 在算法的适当位置运行代码(例如,排序中的比较操作)
  4. 发生某种情况时执行代码(例如,点击了一个按钮,数据到达,等等)
  5. 只在必要时才运行代码
函数式接口
repeat(10, () -> System.out.println("hello world"));

要接收这个 Lambda 表达式,需要选择(偶尔可能需要提供)一个函数式接口。

public static void repeat( int n, Runnable action){
    for (int i=0l i<1n; i++) action.run();
}
函数式接口参数类型返回类型抽象方法名描述其他方法
Runnablevoidrun作为无参数或返回值的动作运行
SupplierTget提供一个T类型的值
ConsumerTvoidaccept处理一个T类型的值andThen
BiComsumer <T, U>T, Uvoidaccept处理T和U类型的值andThen
Function<T, R>TRapply有一个T类型参数的函数compose, andThen, identity
BiFunction<T, U, R>T, URapply有T和U类型参数的函数andThen
UnaryOperatorTTapply类型T上的一元操作符compose, andThen, identity
BinaryOperatorT, TTapply类型T上的二元操作符andThen, maxBy, minBy
PredicateTbooleantest布尔值函数and, or, negate, isEqual
BiPredicate<T, U>T, Ubooleantest有两个参数的布尔值函数and, or, negate
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值