电子商务网站模式,北京seo网站结构优化,印度做网站,汽车报价软件排行榜文章目录 Lambda表达式 概述#xff08;一#xff09;基本作用#xff08;二#xff09;特点 一#xff0c;初识Java中的Lambda 表达式二#xff0c;函数式编程三#xff0c;省略写法四#xff0c;练习#xff1a;使用Lambda 表达式 简化Comparator接口的匿名形式综合… 文章目录 Lambda表达式 概述一基本作用二特点 一初识Java中的Lambda 表达式二函数式编程三省略写法四练习使用Lambda 表达式 简化Comparator接口的匿名形式综合练习一按照需求进行排序二不死神兔三猴子吃桃四爬楼梯 Lambda表达式 概述
Lambda 表达式Lambda Expressions是一种简洁的表示匿名函数anonymous function的方法它允许将函数作为方法的参数MOPMethod Ordered Parameters或者代码中的一部分进行传递。这种表达式在 Python、JavaScript、Java 等多种编程语言中都有应用。
一基本作用
Lambda表达式在Java和其他函数式编程语言中有着广泛的应用。其主要作用包括
简化代码Lambda表达式可以作为参数传递给其他函数或者在函数中创建简短、可读性更高的代码这样可以帮助减少代码量并提升代码的可读性和可维护性。函数式编程Lambda表达式使得函数式编程在Java中变得可能。函数式编程强调将计算作为数学上的函数求值避免改变状态和使用可变数据。通过Lambda表达式可以更方便地实现函数式接口。匿名函数Lambda表达式是一种匿名函数可以作为参数传递给其他函数或者在函数中作为代码片段直接使用而不需要定义一个显式的函数名称。提升代码可维护性由于Lambda表达式可以使代码更加简洁和模块化这使得代码更容易理解和维护。
总的来说Lambda表达式是一种强大的工具可以使代码更简洁更易读更模块化从而提升代码的可维护性和可重用性。
二特点
Lambda表达式是Java 8中最重要的新功能之一它有以下几个特点
函数式编程Lambda表达式可以替代只有一个抽象函数的接口实现它是一种函数式编程的方式可以帮助我们编写更简洁易懂的代码。参数类型自动推断Lambda表达式中的参数类型可以自动推断不需要显式地指定类型。代码量少、简洁使用Lambda表达式可以将代码量减少使代码更加简洁易懂。Lambda表达式的语法也很简洁易于编写和阅读。
Lambda表达式的应用场景非常广泛它可以应用于任何有函数式接口的地方例如集合、框架的迭代、遍历、过滤数据的操作等。
一初识Java中的Lambda 表达式
下面是一个简单的Java Lambda表达式的示例它使用Lambda表达式来实现一个简单的接口方法
interface MyInterface {void doSomething();
}public class LambdaExample {public static void main(String[] args) {// 使用Lambda表达式实现MyInterface接口的doSomething方法MyInterface myLambda () - System.out.println(Hello Lambda!);// 调用MyInterface接口的doSomething方法myLambda.doSomething();}
}输出
Hello Lambda!在这个示例中定义了一个MyInterface接口它只有一个没有参数的doSomething方法。然后在main方法中使用Lambda表达式来创建一个实现该接口的对象并将其赋值给myLambda变量。最后调用myLambda对象的doSomething方法该方法会输出“Hello Lambda!”。
二函数式编程
函数式编程是一种编程范式它将计算视为数学上的函数求值并避免改变状态和使用可变数据。在 Java 中函数式编程的主要特点包括
不可变性Immutability: 在函数式编程中一旦一个变量被赋值你就不能改变它。这意味着你不能更改变量的状态这也被称为“不可变性”。纯函数Pure Functions: 纯函数是一种既不改变外部状态也不依赖外部状态的函数它给定相同的输入就会产生相同的输出而且没有任何副作用。高阶函数Higher-Order Functions: 高阶函数是接受一个或多个函数作为输入参数或返回一个函数作为结果的函数。
Java 8 引入了 Lambda 表达式和函数式接口使得 Java 编程语言更加支持函数式编程。以下是一些 Java 8 之后的函数式编程例子
Lambda 表达式
Lambda 表达式是一种简洁的表示匿名函数的方法它没有名称但有参数列表函数主体返回类型并且可以被赋值给变量或传递给方法作为参数。
例如
ListInteger numbers Arrays.asList(1, 2, 3, 4, 5);// 使用 lambda 表达式实现过滤功能
ListInteger evenNumbers numbers.stream().filter(n - n % 2 0).collect(Collectors.toList());在这个例子中n - n % 2 0 就是一个 Lambda 表达式它实现了 FilterInteger 接口的 test 方法。
函数式接口
函数式接口是只有一个抽象方法的接口。Java 8 中的 FunctionalInterface 注解可以标记这样的接口。
例如
FunctionalInterface
interface GreetingService {void sayMessage(String message);
}然后你可以使用 Lambda 表达式或方法引用实现这个接口
GreetingService greetService1 message - System.out.println(Hello message);
GreetingService greetService2 System.out::println;greetService1和greetService2都实现了GreetingService接口的sayMessage 方法。
三省略写法
Lambda表达式可以省略一些元素以使代码更简洁以下是Lambda表达式的一些省略写法
参数类型可以省略不写。如果只有一个参数参数类型可以省略同时()也可以省略。如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写同时要省略分号。如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时如果这行代码是return语句必须省略return不写同时也必须省略;。
以上就是Lambda表达式的一些省略写法这些规则的使用可以使你的代码看起来更加简洁易读。
下面展示一个Java Lambda表达式的省略写法示例
ListString list Arrays.asList(Apple, Banana, Orange);// 原始Lambda表达式
list.stream().filter(s - s.startsWith(A)).forEach(System.out::println);// 省略参数类型的Lambda表达式
list.stream().filter(s - s.startsWith(A)).forEach(System.out::println);// 省略大括号和分号的Lambda表达式
list.stream().filter(s - s.startsWith(A)).forEach(s - System.out.println(s));// 省略return语句的Lambda表达式
list.stream().filter(s - s.startsWith(A)).forEach(s - System.out.println(s));这个示例中创建了一个字符串列表并使用Lambda表达式对列表进行过滤和输出。在第一个Lambda表达式中没有省略任何内容。在第二个Lambda表达式中省略了参数类型。在第三个Lambda表达式中省略了大括号和分号。在第四个Lambda表达式中省略了return语句。
四练习使用Lambda 表达式 简化Comparator接口的匿名形式
需求定义数组并存储一些字符串利用Arrays中的sort方法进行排序按照字符串的长度进行排序短的在前面长的在后面暂时不比较字符串里面的内容。
在Java中可以使用Lambda表达式和Comparator接口来简化排序操作。以下是按照字符串长度进行排序的示例
import java.util.Arrays;
import java.util.Comparator;public class Main {public static void main(String[] args) {// 定义并初始化字符串数组String[] strings {Java, Python, C, JavaScript, Go};// 使用Lambda表达式和Comparator接口进行排序Arrays.sort(strings, Comparator.comparingInt(String::length));// 打印排序后的数组for (String str : strings) {System.out.println(str);}}
}在这个示例中Comparator.comparingInt(String::length)是一个Lambda表达式它实现了Comparator接口的compare方法。这个表达式接受两个字符串参数并通过调用String::length方法获取它们的长度然后比较这两个长度值。
这个Lambda表达式相当于下面的匿名类实现
Arrays.sort(strings, new ComparatorString() {Overridepublic int compare(String s1, String s2) {return Integer.compare(s1.length(), s2.length());}
});使用Lambda表达式可以简化代码并提高代码的可读性。
综合练习
一按照需求进行排序
需求定义数组并存储一些朋友对象利用Arrays中的sort方法进行排序。 属性有姓名、年龄和身高。 按照年龄的大小进行排序年龄一样按照升高排序身高一样按照姓名的字母进行排序姓名中不要有中文或特殊字符。
在Java中可以创建一个Friend类来存储朋友的姓名、年龄和身高然后使用Arrays.sort()方法和Lambda表达式来排序。
首先创建一个Friend类
public class Friend {private String name;private int age;private double height;public Friend(String name, int age, double height) {this.name name;this.age age;this.height height;}public String getName() {return name;}public int getAge() {return age;}public double getHeight() {return height;}Overridepublic String toString() {return Friend{ name name \ , age age , height height };}
}然后你可以创建一个Friend数组并排序
import java.util.Arrays;
import java.util.Comparator;public class Main {public static void main(String[] args) {Friend[] friends new Friend[]{new Friend(Alice, 25, 160.5),new Friend(Bob, 20, 175.2),new Friend(Charlie, 23, 170.0),new Friend(David, 20, 172.0),new Friend(Eve, 25, 155.0)};Arrays.sort(friends, Comparator.comparingInt((Friend f) - f.getAge()).thenComparingDouble(f - f.getHeight()).thenComparing(f - f.getName()));for (Friend friend : friends) {System.out.println(friend);}}
}在这个例子中Arrays.sort()方法使用一个自定义的比较器来排序。比较器首先比较年龄如果年龄相同则比较身高如果身高也相同则比较姓名。
二不死神兔
需求有个很有名的数学逻辑题叫做不死神兔问题有一対兔子从出生到第三个月起每个月都生一对兔子小兔子长到第三个月后又生一对兔子假设兔子都不死问第十二个月的兔子对数为多少
这是一个经典的斐波那契数列问题下面是一个的Java示例可以计算第十二个月的兔子对数
public class RabbitProblem {public static void main(String[] args) {int months 12;int[] rabbitPairs new int[months];// 初始化前三个月的兔子对数rabbitPairs[0] 1;rabbitPairs[1] 1;rabbitPairs[2] 1;// 计算后九个月的兔子对数for (int i 3; i months; i) {rabbitPairs[i] rabbitPairs[i - 1] rabbitPairs[i - 2];}// 输出第十二个月的兔子对数System.out.println(第十二个月的兔子对数为 rabbitPairs[months - 1]);}
}这段代码首先定义了一个长度为12的数组用于存储每个月的兔子对数。然后初始化前三个月的兔子对数都是1对。接着使用一个循环计算后九个月的兔子对数每个月的兔子对数等于前两个月的兔子对数之和。最后我们输出第十二个月的兔子对数。
三猴子吃桃
需求有一个猴子摘了一堆桃子第一天吃了一半嘴馋又多吃了一个第二天吃剩余的一半同样嘴馋多吃了一个第三天亦然第10天的时候还没有吃发现只剩下一个桃子了问这个猴子摘了多少桃子
这是一个经典的数学问题可以用递归或者循环来解决。这里我们给出使用循环的Java代码。
public class MonkeyPeach {public static void main(String[] args) {int day 10;int peach 1; // 第10天有1个桃子for (int i 1; i day; i) {// 每一天猴子都吃前一天剩下的一半再加一个peach (peach 1) * 2;}System.out.println(猴子摘了 peach 个桃子);}
}四爬楼梯
需求帅气的小明喜欢爬楼梯他有的时候一次爬一个台阶有的时候一次爬两个台阶。如果这个楼梯有20个台阶小明一个共有多少种爬法
运行结果 1层台阶 1种爬法 2层台阶 2种爬法 7层台阶 21种爬法
这个问题实际上是一个经典的动态规划问题类似于斐波那契数列问题。小明爬楼梯的方式实际上就是斐波那契数列的表现形式即F(n) F(n-1) F(n-2)。
以下是一段Java代码可以计算出小明爬20层楼梯有多少种爬法
public class Main {public static void main(String[] args) {int n 20;System.out.println(n 层台阶 climbStairs(n) 种爬法);}public static int climbStairs(int n) {if (n 2) {return n;}int[] dp new int[n 1];dp[1] 1;dp[2] 2;for (int i 3; i n; i) {dp[i] dp[i - 1] dp[i - 2];}return dp[n];}
}在这段代码中climbStairs函数会计算出爬n层楼梯有多少种爬法。这个函数首先处理了小于等于2的情况然后用动态规划的方式计算出了大于2的情况。动态规划的思路是爬到第i层的方法数等于爬到第i-1层的方法数加上爬到第i-2层的方法数。最后这个函数返回了爬到n层的方法数。