java Lambda表达式

Wesley13
• 阅读 714

简介

  Lambda可以理解为简洁的表示可传递的匿名函数,包括:参数列表、函数主体、返回类型、抛出的异常列表(可以不存在)。

  函数式接口:定义一个抽象方法的接口(接口可以拥有默认方法:default)。

  函数式接口有什么用?

    Lambda可以以内联的形式为函数式接口的抽象方法提供实现。虽然内部类也可以实现,但lambda表达式更加简洁。当然内部类也存在它的优势,它可以为接口实现多个抽象方法。

Comparator<Apple> byWeight =
 (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());

  参数列表:包括a1、a2,这里参数为显式类型(Apple类);也可以没有显示类型,java编译器会根据上下文配合Lambda表达式的函数式接口。

  箭头:-> 将参数列表和函数主体分开

  函数主体:要完成的功能;表达式作为返回值

1、(String s)->return s;
2、(String s)->{"Hello world"};
3、(String s)->"Hello world"

  表达式1:return是一个控制流语句,需要用{}

  表达式2:“Hello world”是一个表达式,不是语句,不需要花括号。

  表达式3:正确

java.util.function包中的三个常用函数式接口:

  1、Predicate

@FunctionalInterfacepublic interface Predicate<T>{
  boolean test(T t);
} 

  2、Consumer

@FunctionalInterface
public interface Consumer<T>{
  void accept(T t);
} 

  3、Function

@FunctionalInterface
public interface Function<T, R>{
  R apply(T t);
} 

注意:

  1、由于Lambda只能捕捉给它的局部变量一次,局部变量必须显示申明为final或事实上为final。(局部变量保存在栈)

  2、Lambda的主体为语句表达式时,它可以和返回为void的函数描述符兼容。add方法实际返回boolean类型,Consumer的accept方法返回为void类型,可以兼容而不报错。

Consumer<String> l = s -> list.add(s);

方法引用:这里选用最常见的sort方法,假设提供了一个Apple类,存在weight(重量)这个属性,类型为Integer(方便使用compareTo进行说明),现在我们要求按重量排序。

  两行代码的实现相同,第一行

apples.sort((Apple a1, Apple a2)-> a1.getWeight().compareTo(a2.getWeight()));

apples.sort(Comparator.comparing(Apple::getWeight));

复合lambda表达式:将多个简单的lambda复合成复杂的表达式。

  1、比较器复合

// 逆序apples.sort(Comparator.comparing(Apple::getWeight).reversed());// 比较器链apples.sort(Comparator.comparing(Apple::getWeight).thenComparing(Apple::getColor()));

  2、微词复合:negate(非)、and和or。

  3、函数复合

Function<Integer, Integer> f = x -> x+1;
Function<Integer, Integer> g = x -> x*2;
Function<Integer, Integer> h1 = f.andThen(g);  //可以看作数学函数:h1 = f(g(x))
Function<Integer, Integer> h2 = f.compose(g);  //h1 = g(f(x))
int result1 = h1.apply(1);  //result1 = 4
int result2 = h2.apply(1);  //result2 = 3
点赞
收藏
评论区
推荐文章
Irene181 Irene181
3年前
Python 之父为什么嫌弃 lambda 匿名函数?
Python支持lambda匿名函数,其扩展的BNF表示法是lambdaexpr::"lambda"parameterlist":"expression,也就是lambda参数序列:表达式。这是一种便捷的函数定义方式,若翻译成我们熟知的函数形式,会是这个样子:def <lambda(parameterlist):    retu
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Lambda表达式中Collections的接口有哪些变化?
我们先从最熟悉的\Java集合框架(JavaCollectionsFramework,JCF)\开始说起。为引入Lambda表达式,Java8新增了java.util.function包,里面包含常用的函数接口,这是Lambda表达式的基础,Java集合框架也新增部分接口,以便与Lambda表达式对接。首先回顾一下Java集合框架的接口继承
Wesley13 Wesley13
3年前
Java8特性
Java8又称jdk1.8。主要新特性:Lambda表达式 −Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。方法引用 −方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
Wesley13 Wesley13
3年前
Java8
  不管lambda表达式还是Stream流式编程,Function、Consumer、Supplier、Predicate四个接口是一切函数式编程的基础。下面我们详细学习这四个巨头,interfaceSupplier<T    该接口的中文直译是“提供者”,可以理解为定义一个lambda表达式,
Wesley13 Wesley13
3年前
Java 8 Lambda表达式的使用
lambda表达式允许你通过表达式来代替功能接口。lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。Lambda表达式还增强了集合库。JavaSE8添加了2个对集合数据进行批量操作的包:java.util.function包以及java.util.stre
Wesley13 Wesley13
3年前
Java8之Stream
在使用Stream之前先介绍几个概念:1、函数式接口2、常用的函数式接口3、Lambda4、方法引用 1、函数式接口  1.只定义了一个抽象方法的接口。  2.JDK8接口中的静态方法和默认方法,都不算是抽象方法。  3.接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,
Wesley13 Wesley13
3年前
Java8—一万字的Lambda表达式的详细介绍与应用案例
  基于Java8详细介绍了lambda表达式的语法与使用,以及方法引用、函数式接口、lambda复合等Java8的新特性!文章目录1Lambda的概述2函数式接口2.1Consumer消费型接口2.2Supplier供给型接口2.3Function<T,R函数型接口
Wesley13 Wesley13
3年前
Java8
JDK8自带的函数式接口Function有两个默认方法andThen和compose,它们都返回Function的一个实例,可以用这两个方法把Function接口所代表的的Lambda表达式复合起来。先看个简单的例子:Function<Integer,Integerfxx1;Function<Integer