好程序员分享java8新特性之Lambda表达式

?、Lambda表达式简介

什么是Lambda?

Lambda表达式是Java 8推出的?个新特性。从本质上讲,Lambda表达式是?个匿名函数。

为什么要使?Lambda?

使?Lambda表达式可以对?个接?进??常简洁的实现。

之前我们在给?个接?引?赋值的时候,可以使?接?实现类,或者匿名内部类。但是有了

Lambda表达式,我们可以更加?便的实现这个需求。

interface Comparator<T>?{

int compare(T o1, T o2);

}

class Program?{

public static void main(String[] args) {

// 1. 使?接?实现类实现

class Impl implements Comparator<Integer>?{

@Override

public int compare(Integer o1, Integer o2) {

return o1 - o2;

}

}

Comparator<Integer> c1 = new Impl();

// 2. 使?匿名内部类实现

Comparator<Integer> c2 = new Comparator<Integer>() {

@Override

public int compare(Integer o1, Integer o2) {

return o1 - o2;

}

};

// 3. 使?Lambda表达式实现

Comparator<Integer> c3 =?(o1, o2) -> o1 - o2;

}

}

从上述例?中,我们可以看到: 对同样?个接?引?的实现,Lambda最简单!

Lambda对接?的要求?虽然Lambda表达式可以很便捷的实现接?,但并不是所有的接?都可以使?Lambda表达式来实现。

可以?Lambda表达式来简洁实现的接?是有要求的。因为Lambda表达式本质上来讲,就是?个匿名

函数,?这个匿名函数来实现接?中的?法。所以,如果接?中有多个必须要实现抽象?法时,

Lambda表达式将?法是?。

注:Lambda表达式要求接?中只有?个必须要实现的抽象?法。但是JAVA 8对接?也有?个

拓展。现在,我们可以在接?中,是?default来修饰?个?法,此时,这个?法需要有实

现。那么,实现类在实现接?的时候,对于default?法,可以实现,也可以不实现。所以,

这?所说的接?中只有?个必须实现的抽象?法,与default?法?关。

@FunctionalInterface**

@FunctionalInterface

因为Lambda表达式要求接?中有且只能有?个必须实现的抽象?法,所以,对接?可以使?

@FunctionalInterface接?来进?限定。这个注解约束了接?中只能有?个必须实现的抽象?

法。使?这个注解修饰的接?,?叫做函数式接?。

?、Lambda表达式基础语法

Lambda表达式,本质上就是?个匿名?法,所以离不开?法的?个必要的组成部分:返回值、?法

名、参数、?法体。但是由于他是?个匿名?法,所以?法名可以忽略。同时,Lambda中也不需要

显式声明返回值类型。所以,我们在写Lambda表达式的时候,只需要关?参数和?法体即可。

参数: 以()包围起来,多个参数以逗号分隔

(int a, int b)

?法体: 以{}包围起来

{ System.out.println("hello world"); }

->:?Lambda运算符,?来分隔参数和?法体

(int a, int b) -> {};

有了这?个组成部分,我们就可以对任意的函数式接?使?Lambda进?实现

// ?参、?返回值

() ->?{ System.out.println("hello world"); };

// int, int参数、?返回值

(int a, int b) ->?{ System.out.println(a + b); };

// int, int参数、int返回值

(int a, int b) ->?{ return a + b; };

三、Lambda表达式语法精简

接?中定义的?法,已经声明了?法的参数类型、数量和返回值类型。所以,使?Lambda表达式在

实现的时候,对应的部分可以省略参数精简

  1. 参数的类型可以精简

(int a, int b) -> { System.out.println(a + b); }

可以精简为:

(a, b) -> { System.out.println(a + b); }

  1. 如果参数数量只有?个,?括号可以精简

(int a) -> { System.out.println(a); }

可以精简为:

a -> { System.out.println(a); }

?法体精简

  1. 如果?法体中只有?条语句,则?括号可以省略

a -> { System.out.println(a); }

可以精简为:

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

  1. 如果?法体中唯?的?条语句是返回值,在精简掉?括号后,return也必须省略

a -> { return a * 2; }

可以精简为:

a -> a * 2;

四、Lambda表达式语法进阶之?法引?

什么是?法引?

如果在使?Lambda进?接?实现的时候,需要实现的逻辑已经在某?个?法中实现,则可以直接使

??法引?,指向指定的?法。

interface Calculate?{

int calculate(int a, int b);

}

public class Program?{

public static void main(String[] args) {

// 接?引?

Calculate c =?(a, b) -> a + b;

}

public static int add(int a, int b) {

return a + b;

}

}在上述代码中,main函数中Calculate引?c的实现部分,下?已经有?个?法 add 进?了实现。

所以此时,我们不需要再实现?次,只需要直接指向已经写好的实现即可。所以,可以进?如下改

造:

Calculate c = Program::add;

上?的 Program::add 就是?个?法引?。引?了Program类中的?个静态?法add。

在使??法引?的时候需要注意

  1. 引?的?法参数数量、参数类型、返回值类型必须和函数式接?中的?法定义?致。
  2. ?法引?必须有引?主体,即?法的?属者。例如:上?的add?法是?个静态?法,需要使?

类来调?。所以?法引?就是 类::?法,如果是?个成员?法,则需要使? 对象::?法 的

形式来引?。

构造?法的引?

如果需要引??个构造?法,需要使? 类::new 进?引?

interface CreatePerson?{

Person getPerson();

}

class Person?{}

class Program?{

public static void main(String[] args) {

CreatePerson c = Person::new;

}

}

五、Lambda表达式之综合案例: 排序Comparator

// 排序

list.sort((o1, o2) -> o2.age - o1.age);

// 使?Lambda表达式来实现Comparator接?,并实例化?个TreeSet对象

TreeSet<Person> set = new TreeSet<>((o1, o2) ->?{

if?(o1.age >= o2.age) {

return -1;

}

else?{

return 1;

}

});

六、Lambda表达式之综合案例: forEach()// 将集合中的每?个元素都带?到?法accept中。

list.forEach(System.out::println);

// 输出集合中所有的偶数

list.forEach(ele ->?{

if?(ele % 2 == 0) {

System.out.println(ele);

}

});

七、Lambda表达式之综合案例: removeIf()

// 将集合中的每?个元素都带?到test?法中, 如果返回值是true,则删除这个元素

// 删除集合中的年龄?于10岁的元素

list.removeIf(ele -> ele.age > 10);

?、Lambda表达式之综合案例: 线程实例化

new Thread(() ->?{

for?(int i = 0; i < 100; i++) {

System.out.println(i);

}

}).start();

九、系统内置函数式接?

系统已经给我们提供了很多函数式接?,?便我们的使?。因此,如果我们需要?到以下?法的时

候,不需要再设计接?,直接使?指定的接?即可。函数式接?

返回值 特殊说明:?个特殊实现的?接?

Predicate T boolean

IntPredicate :参数:int,返回值:boolean

LongPredicate :参数:long,返回值:boolean

DoublePredicate :参数:double,返回值:boolean

Consumer T void

IntConsumer :参数:int,返回值:void LongConsumer :

参数:int,返回值:void DoubleConsumer :参数:int,返

回值:void

Function<T, R> T R

IntFunction<R> :参数:int,返回值:R

IntToDoubleFunction :参数:int,返回值:double

IntToLongFunction :参数:int,返回值:long

LongFunction<R> :参数:long,返回值:R

LongToDoubleFunction :参数:long,返回值:double

LongToIntFunction :参数:long,返回值:int

DoubleFunction<R> :参数:double,返回值:R

DoubleToIntFunction :参数:double,返回值:int

DoubleToLongFunction :参数:double,返回值:long

Supplier ? T

BooleanSupplier :参数:?,返回值:boolean

IntSupplier :参数:?,返回值:int LongSupplier :参

数:?,返回值:long DoubleSupplier :参数:?,返回值:

double

UnaryOperator T T

IntUnaryOperator :参数:int,返回值:int

LongUnaryOperator :参数:long,返回值:long

DoubleUnaryOperator :参数:double,返回值:double

BinaryOperator T,

T T

IntBinaryOperator :参数:int, int,返回值:int

LongBinaryOperator :参数:long, long,返回值:long

DoubleBinaryOperator :参数:double, double,返回值:

double

BiPredicate<L,

R>

L,

R boolean

BiConsumer<T,

U>

T,

U void

BiFunction<T,

U, R>

T,

U R

上述接?中,最常?的是?Predicate、Consumer、

原文地址:https://blog.51cto.com/14479068/2433704

时间: 2024-10-27 13:07:05

好程序员分享java8新特性之Lambda表达式的相关文章

java8新特性之——lambda表达式的使用

lambda表达式简介 个人理解,lambda表达式就是一种新的语法,没有什么新奇的,简化了开发者的编码,其实底层还是一些常规的代码.Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升. Lambda表达式的语法(记得要在jdk1.8及以上的jdk环境下实验) Lambda 表达式的基础语法:Java8中引入了一个新的操作符 "->&

2020了你还不会Java8新特性?Lambda表达式及API(二)

lambda表达式 为什么要使用lambda表示式 在Java中无法将函数座位参数传递给一个方法,也无法返回一个函数的方法. 在js中,函数的参数是一个函数.返回值是另一个函数的情况是非常常见的.是一门经典的函数式语言. Java匿名内部类. 匿名内部类的介绍 Gradle的使用.可以完全使用maven的中央仓库. 进行安卓的开发时,gradle已经成为标配了. lambda: 匿名内部类 my_jButton.addActionListener(new ActionListener() { @

Java8新特性03 Lambda表达式

一. Lambda表达式概述 Lambda表达式是Java8中最大的变化.它允许我们将一个函数当作方法的参数,或者说把一段代码当作数据使用.很多基于JVM平台的语言一开始就支持Lambda表达式,比如Scala,但是Java语言一直只能使用匿名内部类来替代Lambda表达式,直到Java8才使用Lambda表达式. 二.定义 Lambda表达式是一个匿名函数,它是一个函数式接口的具体实现方式:使用Lambda语法可以用来代替Java8之前的匿名内部类,从而简化代码. 任意只包含一个抽象方法的接口

Java8新特性之lambda表达式

lambda表达式 简化实例化函数式接口(functional interface)的过程 lambda表达式的优势 简化代码的实现 lambda表达式的语法 一个 Lambda 表达式可以有零个或多个参数 参数的类型既可以明确声明,也可以根据上下文来推断.例如:(int a)与(a)效果相同 所有参数需包含在圆括号内,参数之间用逗号相隔.例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c) 空圆括号代表参数集为空.例如:() -> 42

C++11 新特性之 Lambda表达式

lambda表达式可以用于创建并定义匿名的函数对象,以简化编程工作 Lambda的语法如下: [函数对象参数](操作符重载函数参数)->返回值类型{函数体} []内的参数指的是Lambda表达式可以取得的变量.(2)函数中的param就是指函数可以得到在Lambda表达式外的全局变量, 如果在[]中传入=的话,即是可以取得所有的外部变量,如(1)和(3)Lambda表达式 ()内的参数是每次调用函数时传入的参数. ->后加上的是Lambda表达式返回值的类型,如(3)中返回了一个int类型的变

C++11新特性(3) lambda表达式(1)

C++11添加了一项名为lambda表达式的新功能.通过这项功能能编写内嵌的匿名函数,而不必编写独立函数或函数对象,使得代码更加理解. lambda表达式包含以下部分. [capture_block](parameters) mutable exception_specification->return_type {body} 现在分析各个部分的内容: (capture_block)捕捉块:指定如何捕捉所在作用域的变量,并供给lambda主体部分使用. (parameter)参数(可选):lam

JDK1.8新特性(二): Lambda表达式 (参数列表) -&gt; { } 和函数式接口@FunctionalInterface

Lambda表达式 二:简介 JDK的升级的目的有以下几个:增加新的功能.修复bug.性能优化.简化代码等几个方面,Lambda表达式就是属于简化代码,用于简化匿名实现类,提供一种更加简洁的写法.Lambda表达式在Swift语言中称之为代码块,Lambda表达式可以认为是一种特殊的接口,该接口必须只有一个抽象方法. 语法 (参数类型 参数名, 数参数类型 参数名2...) -> { // code }; 小括号()中的内容就是方法中的参数列表包括参数类型.参数名,其中参数类型是可以省略的,当参

Java8新特性之lambda

本系列文章翻译自@shekhargulati的java8-the-missing-tutorial Java8中最重要的特性之一就是引入了lambda表达式.这能够使你的代码更加简练,并允许你将行为传递到各处.一段时间以来,Java因为自身的冗长和缺少函数式编程的能力而受到批评.随着函数式编程变得越来越流行和有价值,Java也在努力接受函数式编程.否则,Java将会变得没有价值. Java8在使世界上最受欢迎的编程语言之一在接纳函数式编程的过程中向前迈了一大步.为了支持函数式编程,编程语言必须将

java8新增特性之lambda表达式

java 1.8 为了顺应函数式编程的大势,简化编码工作量,新增加了lambda 表达式. 由于在java中,函数并不是一等公民,不能独立存在,所以,在java中lambda 也必须依托对象存在,其用得最多的地方,是简化匿名内部类的写法. 1 public class LambdaTest { 2 3 private static MathOperation sayHi = name -> { 4 System.out.println("hi!, "+ name); 5 }; 6