在线做动图的网站,麻章网站开发公司,深圳有几个区分布图,互联网保险公司排行榜在现代软件开发中#xff0c;高效和简洁的代码变得越来越重要。Java作为一门成熟而广泛使用的编程语言#xff0c;一直在不断进化#xff0c;以满足开发者的需求。Java 8的推出标志着一次重要的飞跃#xff0c;其中最引人注目的特性之一便是Lambda表达式。 Lambda表达式为J… 在现代软件开发中高效和简洁的代码变得越来越重要。Java作为一门成熟而广泛使用的编程语言一直在不断进化以满足开发者的需求。Java 8的推出标志着一次重要的飞跃其中最引人注目的特性之一便是Lambda表达式。 Lambda表达式为Java带来了函数式编程的灵活性使得代码不仅更加简洁还大大提升了可读性和维护性。不再需要冗长的匿名类开发者可以用更少的代码完成更多的功能。对于那些致力于编写高效、简洁代码的开发者来说掌握Lambda表达式是不可或缺的技能。 在本篇文章中我们将深入探讨Java的Lambda表达式揭示它的强大功能和应用场景。无论你是Java的初学者还是有多年经验的老手这篇文章都将带你领略Lambda表达式的魅力帮助你在编程之旅中迈上新的台阶。 文章目录 1、Lambda表达式概述1.1、Lambda表达式的简介1.2、Lambda 表达式的基本语法1.3、Lambda 表达式的基础示例1.4、Lambda表达式的要求 2、函数式接口2.1、什么是函数式接口2.2、函数式接口的定义2.3、主要的函数式接口2.3.1、接口 PredicateT2.3.2、接口 ConsumerT2.3.3、接口 FunctionT, R2.3.4、接口 SupplierT2.3.5、接口 BiConsumerT, U2.3.6、接口 BiFunctionT, U, R2.3.7、接口 UnaryOperatorT2.3.8、接口 BinaryOperatorT  3、Lambda 方法引用3.1、Lambda 方法引用的介绍3.2、静态方法引用3.3、实例方法引用3.4、特定类型的任意对象的实例方法引用3.5、构造器引用 4、Lambda 变量捕获4.1、变量捕获的类型4.2、什么是 Effectively Final4.3、示例捕获局部变量4.4、不可以捕获的情况4.5、捕获实例变量 5、Lambda 在集合当中的使用5.1、Collection 新增接口5.2、List 新增接口5.3、Set 新增接口5.4、Map 新增接口     1、Lambda表达式概述 
1.1、Lambda表达式的简介 
JavaSE8 于 2014 年 3 月发布引入了多个改进特性其中 Lambda 表达式Lambda expression也可称为闭包Closure是最受欢迎的新特性之一。 
Lambda 表达式允允许把函数作为一个方法的参数允许在方法中传递代码块从而实现更加灵活的编程方式。Lambda 表达式可以简化代码减少样板代码的出现并且使代码更加易读和易于维护。 
Lambda 表达式允许我们通过表达式来代替功能接口。Lambda 表达式就和方法一样它提供了一个正常的参数列表和一个使用这些参数的主体body可以是一个表达式或一个代码块。 
Lambda 表达式为 Java 添加了函数式编程的能力简化了代码使得编写简洁的代码成为可能。这一特性特别适用于对集合进行操作的场景。 
1.2、Lambda 表达式的基本语法 
Lambda 表达式基本上是一个简洁的表示匿名函数的方法它不需要像匿名类那样繁琐。Lambda 表达式的语法如下 
code(parameters) - expression 或 (parameters) - { statements; }其中 Lambda 表达式的三个组成部分 
参数列表parameters类似方法中的形参列表这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由 JVM 隐含的推断。另外如果只有一个参数圆括号也可以省略箭头-连接参数列表和 Lambda 主体,可理解为 “被用于” 的意思Lambda 主体expression 或 { statements; }可以是表达式也可以代码块是函数式接口里方法的实现。①、expression表达式当 Lambda 体只有一条语句时可以是一个表达式或一个单独的语句②、statements代码块如果 Lambda 体包含多条语句需要用花括号括起来。③、无论是表达式还是代码块都可以返回一个值或者什么都不反回。 
1.3、Lambda 表达式的基础示例 
假设我们有一个字符串列表我们想要对其排序。使用 Lambda 表达式前后的代码对比如下 
使用传统方法匿名内部类 
ListString names  Arrays.asList(Peter, Anna, Mike, Xenia);Collections.sort(names, new ComparatorString() {public int compare(String a, String b) {return a.compareTo(b);}
});匿名内部类: 这里 new ComparatorString() {...} 创建了一个 ComparatorString 的匿名实现类。匿名内部类是没有类名的类直接用其父类或要实现的接口作为其类型。 
使用 Lambda 表达式 
ListString names  Arrays.asList(Peter, Anna, Mike, Xenia);Collections.sort(names, (String a, String b) - {return a.compareTo(b);
});--- 或者更简洁Collections.sort(names, (a, b) - a.compareTo(b));1.4、Lambda表达式的要求 
虽然说Lambda 表达式可以在⼀定程度上简化接口的实现。但是并不是所有的接口都可以使用 Lambda 表达式来简洁实现的。 
Lambda 表达式毕竟只是⼀个匿名方法。当实现的接口中的方法过多或者多少的时候Lambda 表达式都是不适用的。 
Lambda 表达式只能实现函数式接口。 2、函数式接口 
2.1、什么是函数式接口 
在 Java 中函数式接口Functional Interface是指具有单一抽象方法的接口但它可以有多个默认default或静态static方法。Java 8 引入了这个概念主要是为了支持 Lambda 表达式同时保持对老代码的兼容性。 
函数式接口的特性 
单一抽象方法这是函数式接口的核心特征它意味着该接口中只有一个没有实现的方法默认方法Java 8 允许在接口中实现方法这些方法被称为默认方法。默认方法不影响接口的函数式接口状态因为它们不是抽象的静态方法接口还可以包含静态方法。这些方法同样不影响接口的函数式接口状态因为静态方法也是具体实现的。 
函数式接口提供了一种将功能逻辑作为数据传递的方式极大地增强了 Java 在编写高效且简洁代码方面的能力。随着 Java 版本的迭代函数式编程已成为开发中不可或缺的工具。 
2.2、函数式接口的定义 
在 Java 中函数式接口通常通过 FunctionalInterface 注解来表示。这个注解不是必需的但它可以帮助编译器检查所标注的接口是否满足函数式接口的条件。标准的定义如下 
FunctionalInterface
public interface MyFunctionalInterface {void execute();
}2.3、主要的函数式接口 
Java 8 引入了 java.util.function 包这个包中定义了一系列的内建函数式接口极大地方便了函数式编程的实践特别是与 Lambda 表达式的结合使用。 
2.3.1、接口 PredicateT 
用途PredicateT 接口定义一个参数的方法返回布尔值。这通常用于判断或过滤数据。 
方法签名boolean test(T t); 
示例使用 PredicateT 过滤一个 ListString移除不符合条件的元素。 
ListString names  Arrays.asList(Peter, Anna, Mike, Xenia);
// 移除以M开头的名字
names.removeIf(name - name.startsWith(M));2.3.2、接口 ConsumerT 
用途ConsumerT 接口定义单一输入参数的 accept 方法不返回任何结果void 返回类型常用于在对象上执行某些操作如打印数据。 
方法签名void accept(T t); 
示例使用 ConsumerT 打印 List 中的每个元素。 
ListInteger numbers  Arrays.asList(1, 2, 3, 4, 5);
numbers.forEach(number - System.out.println(number));2.3.3、接口 FunctionT, R 
用途FunctionT, R 接口定义一个接受一个参数并产生结果的方法常用于映射或转换数据。 
方法签名R apply(T t); 
示例将字符串转换为其长度。 
ListString names  Arrays.asList(Peter, Anna, Mike, Xenia);
ListInteger nameLengths  names.stream().map(name - name.length()).collect(Collectors.toList());2.3.4、接口 SupplierT 
用途SupplierT 不接受任何参数但返回一个值并且这个值的类型是泛型 T。它常用于延迟生成或提供值的场景。 
方法签名T get(); 
示例提供当前时间的字符串格式。 
SupplierString currentTime  () - new SimpleDateFormat(HH:mm:ss).format(new Date());
System.out.println(Current Time:   currentTime.get());2.3.5、接口 BiConsumerT, U 
用途接受两个输入参数无返回结果用于两元素的操作。 
方法签名void accept(T t, U u); 
示例打印两个参数的和。 
BiConsumerInteger, Integer add  (a, b) - System.out.println(Sum:   (a  b));
// 输出 Sum: 8
add.accept(5, 3);  2.3.6、接口 BiFunctionT, U, R 
用途接受两个输入参数返回一个结果用于两元素的操作。 
方法签名R apply(T t, U u); 
示例计算两个参数的和。 
BiFunctionInteger, Integer, Integer add  (a, b) - a  b;
// 计算 12 的结果
Integer sum  add.apply(1, 2);  2.3.7、接口 UnaryOperatorT 
用途一种特殊类型的 Function输入参数类型和返回类型相同。 
方法T apply(T t); 
示例计算参数的平方并返回。 
UnaryOperatorInteger square  x - x * x;
Integer result  square.apply(5);2.3.8、接口 BinaryOperatorT 
用途一种特殊类型的 BiFunction其中两个输入参数和返回类型都相同。 
方法T apply(T t1, T t2); 
示例计算两个参数的积并返回。 
BinaryOperatorInteger multiply  (a, b) - a * b;
Integer product  multiply.apply(5, 3); 3、Lambda 方法引用 
3.1、Lambda 方法引用的介绍 
在 Java 中方法引用是一种简化 lambda 表达式的写法特别是当 lambda 表达式只是直接调用一个已存在的方法时。方法引用提供了一种更清晰、更简洁的方式来引用直接已存在的方法或构造器。 
方法引用有四种主要的类型 
静态方法引用ClassName::methodName实例方法引用instance::methodName特定类型的任意对象的实例方法引用ClassName::methodName构造器引用ClassName::new 
3.2、静态方法引用 
如果函数式接口的实现通过调用一个静态方法来完成可以使用静态方法引用。 
示例 
假设我们有以下静态方法 
public class MathOperations {public static int multiplyByTwo(int i) {return i * 2;}
}我们可以这样使用方法引用替代相应的 lambda 表达式 
FunctionInteger, Integer timesTwo  MathOperations::multiplyByTwo;
// 输出 10
System.out.println(timesTwo.apply(5));  3.3、实例方法引用 
当目标引用是一个实例的方法时可以使用实例方法引用。 
示例 
假设有一个非静态方法 
public class Printer {public void printUpperCase(String s) {System.out.println(s.toUpperCase());}
}使用实例方法引用 
Printer printer  new Printer();
ConsumerString printUpper  printer::printUpperCase;
// 输出 HELLO
printUpper.accept(hello);  3.4、特定类型的任意对象的实例方法引用 
如果方法引用是针对特定类型的任意对象可以使用 ClassName::methodName。 
示例 
FunctionString, String upperFunct  String::toUpperCase;
// 输出 HELLO
System.out.println(upperFunct.apply(hello));这里我们引用了 String 类的 toUpperCase 方法。 
3.5、构造器引用 
构造器引用与方法引用类似但它调用的是类的构造器。 
示例 
假设我们有以下类 
public class Person {private String name;public Person(String name) {this.name  name;}Overridepublic String toString() {return Person{name  name  };}
}使用构造器引用 
FunctionString, Person personCreator  Person::new;
Person p  personCreator.apply(John Doe);// 输出 Person{nameJohn Doe}
System.out.println(p); 4、Lambda 变量捕获 
Lambda 表达式与匿名内部类相似它们都可以访问外围作用域中的变量。这种访问外围变量的行为称为变量捕获。 
4.1、变量捕获的类型 
在 Lambda 表达式中可以捕获两种类型的变量 实例变量和静态变量Lambda 表达式内部可以自由使用实例变量和静态变量而不受任何限制这些变量可以自由地被读取或修改  局部变量可以捕获外围方法的局部变量但这些局部变量必须是事实上的最终变量effectively final即这些变量在初始化后不会再为它们赋新值。  
4.2、什么是 Effectively Final 
一个变量如果被声明为 final那么它就是最终变量。即使变量没有被声明为 final但在初始化后从未改变过那么这个变量也是事实上的最终变量。从 Java 8 开始这样的未声明为 final 的变量也可以在 Lambda 表达式中被捕获。 
4.3、示例捕获局部变量 
public class LambdaCaptureExample {public static void main(String[] args) {int num  10;// Effectively final variableRunnable r  () - System.out.println(num);// 输出 10r.run();}
}在这个例子中变量 num 虽然没有被声明为 final但在初始化之后没有再改变所以它是事实上的最终变量可以在 Lambda 表达式中被安全捕获。 
4.4、不可以捕获的情况 
如果尝试在 Lambda 表达式中捕获一个不是事实上的最终变量编译器将会报错 
public class LambdaCaptureExample {public static void main(String[] args) {int num  10;num  20;  // 修改变量使其不再是 effectively finalRunnable r  () - System.out.println(num);  // 编译错误r.run();}
}因为 num 在初始化后被修改它不是一个事实上的最终变量因此不能被 Lambda 表达式捕获。 
4.5、捕获实例变量 
实例变量与静态变量不需要是事实上的最终变量它们可以在 Lambda 表达式内部被修改 
public class LambdaCaptureExample {private static int staticNum  5;private int instanceNum  5;public void test() {Runnable r  () - {// 直接修改静态变量staticNum;  // 直接修改实例变量instanceNum;// 输出 12System.out.println(staticNum  instanceNum);  };r.run();}public static void main(String[] args) {new LambdaCaptureExample().test();}
}5、Lambda 在集合当中的使用 
Java 8 在 Collection、List、Set、和 Map 接口中引入了多种新方法这些方法大都利用 Lambda 表达式来提高编程效率和简化代码。 
下面是这些接口中新增方法的详细介绍 
5.1、Collection 新增接口 
Collection 接口是 List 和 Set 接口的父接口因此在 Collection 中添加的方法也会影响到这两个接口。以下是新增的几个重要方法 
①、forEach(Consumer? super T action) 对每个元素执行指定的动作。这是内部迭代的一种形式可以替代外部迭代即使用 for-each 循环 
collection.forEach(System.out::println);②、stream() 返回集合的顺序 Stream 表达形式可以进行更复杂的聚合操作 
collection.stream().filter(e - e.startsWith(A)).forEach(System.out::println);③、parallelStream() 返回集合的并行 Stream 表达形式用于并行处理集合元素适用于数据量大时的场景 
collection.parallelStream().filter(e - e.startsWith(A)).forEach(System.out::println);④、removeIf(Predicate? super E filter) 根据指定的条件Predicate 表达式删除元素 
// 删除所有空元素
collection.removeIf(e - e.isEmpty());⑤、spliterator() 提供了一种创建可分割迭代器Spliterator的方法适用于 Stream 的并行分解 
SpliteratorT spliterator  collection.spliterator();5.2、List 新增接口 
除了继承自 Collection 接口的方法外List 接口特有的新增方法主要包括 
①、sort(Comparator? super E c) 根据指定的比较器对列表进行排序此方法直接修改原列表 
list.sort(Comparator.naturalOrder());②、replaceAll(UnaryOperatorE operator) 根据指定的函数应用运算替换每个元素 
// 将所有字符串元素转换为大写
list.replaceAll(String::toUpperCase);  5.3、Set 新增接口 
Set 接口没有特别的新增方法它继承了 Collection 接口的所有新增方法这包括 forEach, stream, parallelStream, removeIf, 和 spliterator。 
5.4、Map 新增接口 
Map 接口在 Java 8 中增加了一系列非常有用的方法来简化常见的任务 
①、forEach(BiConsumer? super K, ? super V action) 对每个键值对执行指定的操作 
map.forEach((key, value) - System.out.println(key  :   value));②、replaceAll(BiFunction? super K, ? super V, ? extends V function) 将每个元素替换为函数的结果 
map.replaceAll((key, value) - value.toUpperCase());③、computeIfAbsent(K key, Function? super K, ? extends V mappingFunction) 如果键对应的值为 null则尝试计算新的映射并插入到 Map 中 
map.computeIfAbsent(key, k - New   k);④、computeIfPresent(K key, BiFunction? super K, ? super V, ? extends V remappingFunction) 如果键存在则使用给定的重新映射函数计算其值 
map.computeIfPresent(key, (k, v) - v   Updated);⑤、compute(K key, BiFunction? super K, ? super V, ? extends V remappingFunction) 对键进行重新计算无论原来是否存在 
map.compute(key, (k, v) - (v  null) ? New Value : v   Computed);⑥、merge(K key, V value, BiFunction? super V, ? super V, ? extends V remappingFunction) 将键映射到给定值和当前值如果已存在的重新映射结果 
map.merge(key, New Value, (v1, v2) - v1  ,   v2);这些方法使得对集合进行操作更加灵活和强大特别是在需要对集合进行批量操作、计算或条件更新时。通过这些工具Java的集合库更加贴近现代编程需求使得代码不仅更简洁而且性能也有所提升。 文章转载自: http://www.morning.wxrbl.cn.gov.cn.wxrbl.cn http://www.morning.kzyr.cn.gov.cn.kzyr.cn http://www.morning.zpfr.cn.gov.cn.zpfr.cn http://www.morning.bnfsw.cn.gov.cn.bnfsw.cn http://www.morning.xfhms.cn.gov.cn.xfhms.cn http://www.morning.uytae.cn.gov.cn.uytae.cn http://www.morning.pkmw.cn.gov.cn.pkmw.cn http://www.morning.qhvah.cn.gov.cn.qhvah.cn http://www.morning.ssxlt.cn.gov.cn.ssxlt.cn http://www.morning.cbnlg.cn.gov.cn.cbnlg.cn http://www.morning.zpstm.cn.gov.cn.zpstm.cn http://www.morning.rbsmm.cn.gov.cn.rbsmm.cn http://www.morning.mtmnk.cn.gov.cn.mtmnk.cn http://www.morning.czcbl.cn.gov.cn.czcbl.cn http://www.morning.cwlxs.cn.gov.cn.cwlxs.cn http://www.morning.trqzk.cn.gov.cn.trqzk.cn http://www.morning.gmmyn.cn.gov.cn.gmmyn.cn http://www.morning.zpyh.cn.gov.cn.zpyh.cn http://www.morning.xmrmk.cn.gov.cn.xmrmk.cn http://www.morning.xbnkm.cn.gov.cn.xbnkm.cn http://www.morning.crhd.cn.gov.cn.crhd.cn http://www.morning.qyhcm.cn.gov.cn.qyhcm.cn http://www.morning.qklff.cn.gov.cn.qklff.cn http://www.morning.pzjrm.cn.gov.cn.pzjrm.cn http://www.morning.fncgw.cn.gov.cn.fncgw.cn http://www.morning.wkmyt.cn.gov.cn.wkmyt.cn http://www.morning.wbqk.cn.gov.cn.wbqk.cn http://www.morning.ppqjh.cn.gov.cn.ppqjh.cn http://www.morning.kpcjl.cn.gov.cn.kpcjl.cn http://www.morning.hjwkq.cn.gov.cn.hjwkq.cn http://www.morning.dlrsjc.com.gov.cn.dlrsjc.com http://www.morning.gfjgq.cn.gov.cn.gfjgq.cn http://www.morning.sjftk.cn.gov.cn.sjftk.cn http://www.morning.lpgw.cn.gov.cn.lpgw.cn http://www.morning.rqhn.cn.gov.cn.rqhn.cn http://www.morning.dcccl.cn.gov.cn.dcccl.cn http://www.morning.fbpyd.cn.gov.cn.fbpyd.cn http://www.morning.kbqbx.cn.gov.cn.kbqbx.cn http://www.morning.lsbjj.cn.gov.cn.lsbjj.cn http://www.morning.rxwfg.cn.gov.cn.rxwfg.cn http://www.morning.zdxinxi.com.gov.cn.zdxinxi.com http://www.morning.pxlql.cn.gov.cn.pxlql.cn http://www.morning.rptdz.cn.gov.cn.rptdz.cn http://www.morning.ycgrl.cn.gov.cn.ycgrl.cn http://www.morning.ishoufeipin.cn.gov.cn.ishoufeipin.cn http://www.morning.qbgff.cn.gov.cn.qbgff.cn http://www.morning.rxlk.cn.gov.cn.rxlk.cn http://www.morning.zcwtl.cn.gov.cn.zcwtl.cn http://www.morning.nywrm.cn.gov.cn.nywrm.cn http://www.morning.nlgnk.cn.gov.cn.nlgnk.cn http://www.morning.xbhpm.cn.gov.cn.xbhpm.cn http://www.morning.phwmj.cn.gov.cn.phwmj.cn http://www.morning.mxdiy.com.gov.cn.mxdiy.com http://www.morning.qnjcx.cn.gov.cn.qnjcx.cn http://www.morning.qkzdc.cn.gov.cn.qkzdc.cn http://www.morning.qmnjn.cn.gov.cn.qmnjn.cn http://www.morning.rnsjp.cn.gov.cn.rnsjp.cn http://www.morning.mngyb.cn.gov.cn.mngyb.cn http://www.morning.kyfnh.cn.gov.cn.kyfnh.cn http://www.morning.qpmwb.cn.gov.cn.qpmwb.cn http://www.morning.qfwfj.cn.gov.cn.qfwfj.cn http://www.morning.jcffp.cn.gov.cn.jcffp.cn http://www.morning.drbwh.cn.gov.cn.drbwh.cn http://www.morning.rnpt.cn.gov.cn.rnpt.cn http://www.morning.jpnfm.cn.gov.cn.jpnfm.cn http://www.morning.rxwfg.cn.gov.cn.rxwfg.cn http://www.morning.lwygd.cn.gov.cn.lwygd.cn http://www.morning.rymb.cn.gov.cn.rymb.cn http://www.morning.mkrqh.cn.gov.cn.mkrqh.cn http://www.morning.plcyq.cn.gov.cn.plcyq.cn http://www.morning.jzccn.cn.gov.cn.jzccn.cn http://www.morning.qscsy.cn.gov.cn.qscsy.cn http://www.morning.zbnkt.cn.gov.cn.zbnkt.cn http://www.morning.hpspr.com.gov.cn.hpspr.com http://www.morning.rxnr.cn.gov.cn.rxnr.cn http://www.morning.mfqmk.cn.gov.cn.mfqmk.cn http://www.morning.xkyst.cn.gov.cn.xkyst.cn http://www.morning.bflws.cn.gov.cn.bflws.cn http://www.morning.syglx.cn.gov.cn.syglx.cn http://www.morning.tnwwl.cn.gov.cn.tnwwl.cn