首页 » 网站建设 » phplambda表达式技巧_Java Lambda表达式详解异常周全

phplambda表达式技巧_Java Lambda表达式详解异常周全

访客 2024-11-09 0

扫一扫用手机浏览

文章目录 [+]

Java Lambda表达式是JDK8引入的,是一个比较主要的特性。
@mikechen

Lambda表达式简介

Lambda 表达式是 JDK8 的一个新特性,也被称为闭包,Lambda表达式许可把函数作为一个方法的参数,即行为参数化,函数作为参数通报进方法中。

phplambda表达式技巧_Java Lambda表达式详解异常周全

Lambda表达式可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在凑集的遍历和其他凑集操作中,可以极大地优化代码构造。

phplambda表达式技巧_Java Lambda表达式详解异常周全
(图片来自网络侵删)
Lambda表达式的浸染

Java 8 引入的 Lambda表达式的紧张浸染便是简化代码,写出更优雅的代码。

怎么一个简化优雅呢,举一Lambda语法创建线程和匿名内部类创建线程的例子,就非常清楚了。

1.匿名类创建线程

// JDK7匿名内部类写法new Thread(new Runnable() {//接口名 @Override public void run() {//方法名 System.out.println("mikechen"); } });2.Lambda表达式创建线程

// JDK8 Lambda来创建线程 new Thread(() -> System.out.println("mikechen"));

上述代码跟匿名内部类的浸染是一样的,但比匿名内部类更进一步,这里连接口名和函数名都一同省却了,Lambda表达式可以取代匿名内部类,写出更优雅的代码。

Lambda表达式的语法

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

():左侧部分指定了Lambda表达式须要的所有参数。
->:Lambda表达式的操作符或者箭头操作符。
{}:右侧部分指定了Lambda体,即方法须要实现的内容。

示例:

Lambda体只有一条语句:

示例:

() -> System.out.println("mikechen");

请把稳,括号中没有内容。
那便是表示lambda不带任何参数。

2.一个参数

示例:

Consumer<String> con = (x) -> System.out.println(x);

当lambda表达式是单个参数时,也可以省略括号,如下所示:

Consumer<String> con = x -> System.out.println(x);3.多个参数

如果Java lambda表达式匹配的方法有多个参数,则须要在括号内列出这些参数,代码如下:

BinaryOperator<Integer> bo = (a, b) -> {System.out.println("函数式接口");return a + b;};

把稳:仅当方法是单个参数时,才可以省略括号。

4.指定参数类型

如果编译器无法从lambda匹配的函数式接口抽象方法推断参数类型,则有时可能须要为lambda表达式指定参数类型。

(Car car) -> System.out.println("The car is: " + car.getName());

如你所见,car参数的类型(Car)写在参数名称的前面,就像在其他方法中声明参数或对接口进行匿名实现时一样。

5.只有一条语句时

当Lambda体只有一条语句时,return和大括号可以省略,示例:

BinaryOperator<Integer> bo = (a, b) -> a + b;6.参数类型不写

Lambda表达式的参数列表的数据类型可以省略不写,由于JVM编译器能够通过高下文推断出数据类型,这便是“类型推断”,示例:

BinaryOperator<Integer> bo = (Integer a, Integer b) -> {return a + b;};

等同于

BinaryOperator<Integer> bo = (a, b) -> {return a + b;};

上述 Lambda 表达式中的参数类型都是由编译器推断得出,Lambda 表达式中无需指定类型,程序依然可以编译,这是由于 javac 根据程序的高下文,在后台推断出了参数的类型。

Lambda 表达式的类型依赖于高下文环境,是由编译器推断出来的,这便是所谓的“类型推断”。

7.Lambda表达式返回值

你可以从Java lambda表达式返回值,就像从方法中返回值一样。
你只需向lambda表达式主体添加一个return,如下所示:

(param) -> { System.out.println("param: " + param); return "return value"; }函数式接口

Lambda表达式须要函数式接口的支持,以是,我们有必要来说说什么是函数式接口。

@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface FunctionalInterface {}

一种用于表示一个接口是Java措辞规范定义的函数式接口的表明类型。

对付函数式接口,我们可以理解为只有一个抽象方法的接口,除此之外它和别的接口比较并没有什么分外的地方。

public interface MyFunctionInterface<T> {public T getValue(T t);}

为了确保函数式接口的精确性,我们可以给这个接口添加@FunctionalInterface表明,这样当个中有超过一个抽象方法时就会报错。

Unexpected @FunctionalInterface annotation @FunctionalInterface ^ WorkerInterface is not a functional interface multiple non-overriding abstract methods found in interface WorkerInterface 1 error

Java 8中每一个Lambda表达式必须有一个函数式接口与之对应,也便是说,只要一个工具是函数式接口的实例,那么该工具就可以用Lambda表达式来表示。

Lambda表达式的举例

学习 Lambda 表达式的最好办法是学习例子,下面我们看几个比较常用的例子。

1.lambda创建线程

利用() -> {} 替代匿名类:

//JDK 8之前new Thread(new Runnable() {@Overridepublic void run() {System.out.println("利用匿名内部类,开线程");}}).start();//JDK 8 利用lambda表达式new Thread(() -> System.out.println("利用lambda表达式,开线程")).start();2.lambda事宜处理

利用lambda表达式如下所示写出更好的事宜侦听器的代码:

// Java 8之前:button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("Button被点击了利用老的办法!");}});// Java 8办法:button.addActionListener( (e) -> {System.out.println("Button被点击了利用Lambda表达式!");});3.lambda遍历List凑集

凑集的遍历,采取lambda表达式会更简洁:

// Java 8之前:List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");for (String feature : features) {System.out.println(feature);}// Java 8之后:List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");features.forEach(n -> System.out.println(n));// 利用Java 8的方法引用更方便,方法引用由::双冒号操作符标示,features.forEach(System.out::println);

方法引用是利用两个冒号::这个操作符号。

4.元素排序

之前我们若要为凑集内的元素排序,就必须调用 sort 方法,传入比较看重写 compare。

方法的比较器工具,现在我们还可以利用 lambda 表达式来简化代码。

public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); list.add("d"); list.add("b"); list.add("c"); list.sort((o1,o2)->o1.compareTo(o2)); list.forEach(System.out::println);}5.lambda Map

// 不该用lambda表达式为每个订单加上12%的税List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);for (Integer cost : costBeforeTax) {double price = cost + .12cost;System.out.println(price);}// 利用lambda表达式List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);costBeforeTax.stream().map((cost) -> cost + .12cost).forEach(System.out::println);6.lambda过滤String

// 创建一个字符串列表,每个字符串长度大于2List<String> filtered = strList.stream().filter(x -> x.length()> 2).collect(Collectors.toList());System.out.printf("Original List : %s, filtered list : %s %n", strList, filtered);7.lambda对凑集运用函数

// 将字符串换成大写并用逗号链接起来List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy", "U.K.","Canada");String G7Countries = G7.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", "));System.out.println(G7Countries);8.lambda打算最大值、最小值、均匀值

//获取数字的个数、最小值、最大值、总和以及均匀值List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);IntSummaryStatistics stats = primes.stream().mapToInt((x) -> x).summaryStatistics();System.out.println("Highest prime number in List : " + stats.getMax());System.out.println("Lowest prime number in List : " + stats.getMin());System.out.println("Sum of all prime numbers : " + stats.getSum());System.out.println("Average of all prime numbers : " + stats.getAverage());

以上便是Java 8的lambda表达式的详解,希望对你有所用!

更多架构技能干货,私信【架构】即可查看我原创的300期+BAT架构技能系列文章与1000+大厂口试题答案合集。

相关文章

方舟生存代码虚拟世界中的生存智慧

虚拟现实游戏成为了人们休闲娱乐的新宠。在众多虚拟世界中,方舟生存代码凭借其独特的游戏设定和丰富的生存挑战,吸引了大量玩家。本文将带...

网站建设 2025-02-18 阅读0 评论0

方舟红色鱼竿这款渔具传奇背后的故事

在渔具界,有一款鱼竿被广大钓鱼爱好者津津乐道,那就是“方舟红色鱼竿”。它凭借卓越的性能、精湛的工艺和悠久的历史,成为了钓鱼爱好者的...

网站建设 2025-02-18 阅读0 评论0

夏普打印机维修代码技术与实战攻略

夏普打印机作为市场上备受欢迎的办公设备之一,以其稳定的性能和出色的打印质量赢得了广大用户的好评。在长时间的使用过程中,打印机难免会...

网站建设 2025-02-18 阅读0 评论0