2024年Web前端最新Java进阶(五十五)-Java Lambda表达式入门_eclipse lambda(1),面试必备

对象篇

模块化编程-自研模块加载器

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

Arrays.sort(players, sortByName);

// 1.3 也可以采用如下形式:

Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2)));

复制代码
??其他的排序如下所示。 和上面的示例一样,代码分别通过匿名内部类和一些lambda表达式来实现Comparator :

// 1.1 使用匿名内部类根据 surname 排序 players

Arrays.sort(players, new Comparator() {

@Override

public int compare(String s1, String s2) {

return (s1.substring(s1.indexOf(" ")).compareTo(s2.substring(s2.indexOf(" "))));

}

});

// 1.2 使用 lambda expression 排序,根据 surname

Comparator sortBySurname = (String s1, String s2) ->

( s1.substring(s1.indexOf(" ")).compareTo( s2.substring(s2.indexOf(" ")) ) );

Arrays.sort(players, sortBySurname);

// 1.3 或者这样,怀疑原作者是不是想错了,括号好多...

Arrays.sort(players, (String s1, String s2) ->

( s1.substring(s1.indexOf(" ")).compareTo( s2.substring(s2.indexOf(" ")) ) )

);

// 2.1 使用匿名内部类根据 name lenght 排序 players

Arrays.sort(players, new Comparator() {

@Override

public int compare(String s1, String s2) {

return (s1.length() - s2.length());

}

});

// 2.2 使用 lambda expression 排序,根据 name lenght

Comparator sortByNameLenght = (String s1, String s2) -> (s1.length() - s2.length());

Arrays.sort(players, sortByNameLenght);

// 2.3 or this

Arrays.sort(players, (String s1, String s2) -> (s1.length() - s2.length()));

// 3.1 使用匿名内部类排序 players, 根据最后一个字母

Arrays.sort(players, new Comparator() {

@Override

public int compare(String s1, String s2) {

return (s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1));

}

});

// 3.2 使用 lambda expression 排序,根据最后一个字母

Comparator sortByLastLetter =

(String s1, String s2) ->

(s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1));

Arrays.sort(players, sortByLastLetter);

// 3.3 or this

Arrays.sort(players, (String s1, String s2) -> (s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1)));

复制代码
??就是这样,简洁又直观。 在下一节中我们将探索更多lambdas的能力,并将其与 stream 结合起来使用。


### 使用Lambdas和Streams


??Stream是对集合的包装,通常和lambda一起使用。 使用lambdas可以支持许多操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等等。同样,Stream使用懒运算,他们并不会真正地读取所有数据,遇到像getFirst() 这样的方法就会结束链式语法。在接下来的例子中,我们将探索lambdas和streams 能做什么。我们创建了一个Person类并使用这个类来添加一些数据到list中,将用于进一步流操作。 Person 只是一个简单的POJO类:

public class Person {

private String firstName, lastName, job, gender;

private int salary, age;

public Person(String firstName, String lastName, String job,

String gender, int age, int salary) {

this.firstName = firstName;

this.lastName = lastName;

this.gender = gender;

this.age = age;

this.job = job;

this.salary = salary;

}

// Getter and Setter

// . . . . .

}

复制代码
??接下来,我们将创建两个list,都用来存放Person对象:

List javaProgrammers = new ArrayList() {

{

add(new Person("Elsdon", "Jaycob", "Java programmer", "male", 43, 2000));

add(new Person("Tamsen", "Brittany", "Java programmer", "female", 23, 1500));

add(new Person("Floyd", "Donny", "Java programmer", "male", 33, 1800));

add(new Person("Sindy", "Jonie", "Java programmer", "female", 32, 1600));

add(new Person("Vere", "Hervey", "Java programmer", "male", 22, 1200));

add(new Person("Maude", "Jaimie", "Java programmer", "female", 27, 1900));

add(new Person("Shawn", "Randall", "Java programmer", "male", 30, 2300));

add(new Person("Jayden", "Corrina", "Java programmer", "female", 35, 1700));

add(new Person("Palmer", "Dene", "Java programmer", "male", 33, 2000));

add(new Person("Addison", "Pam", "Java programmer", "female", 34, 1300));

}

};

List phpProgrammers = new ArrayList() {

{

add(new Person("Jarrod", "Pace", "PHP programmer", "male", 34, 1550));

add(new Person("Clarette", "Cicely", "PHP programmer", "female", 23, 1200));

add(new Person("Victor", "Channing", "PHP programmer", "male", 32, 1600));

add(new Person("Tori", "Sheryl", "PHP programmer", "female", 21, 1000));

add(new Person("Osborne", "Shad", "PHP programmer", "male", 32, 1100));

add(new Person("Rosalind", "Layla", "PHP programmer", "female", 25, 1300));

add(new Person("Fraser", "Hewie", "PHP programmer", "male", 36, 1100));

add(new Person("Quinn", "Tamara", "PHP programmer", "female", 21, 1000));

add(new Person("Alvin", "Lance", "PHP programmer", "male", 38, 1600));

add(new Person("Evonne", "Shari", "PHP programmer", "female", 40, 1800));

}

};

复制代码
??现在我们使用forEach方法来迭代输出上述列表:

System.out.println("所有程序员的姓名:");

javaProgrammers.forEach(§ -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

phpProgrammers.forEach(§ -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

复制代码
??我们同样使用forEach方法,增加程序员的工资5%:

System.out.println("给程序员加薪 5% :");

Consumer giveRaise = e -> e.setSalary(e.getSalary() / 100 * 5 + e.getSalary());

javaProgrammers.forEach(giveRaise);

phpProgrammers.forEach(giveRaise);

复制代码
??另一个有用的方法是过滤器filter() ,让我们显示月薪超过1400美元的PHP程序员:

System.out.println("下面是月薪超过 $1,400 的PHP程序员:")

phpProgrammers.stream()

.filter(§ -> (p.getSalary() > 1400))

.forEach(§ -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

复制代码
??我们也可以定义过滤器,然后重用它们来执行其他操作:

// 定义 filters

Predicate ageFilter = § -> (p.getAge() > 25);

Predicate salaryFilter = § -> (p.getSalary() > 1400);

Predicate genderFilter = § -> ("female".equals(p.getGender()));

System.out.println("下面是年龄大于 24岁且月薪在$1,400以上的女PHP程序员:");

phpProgrammers.stream()

.filter(ageFilter)

.filter(salaryFilter)

.filter(genderFilter)

.forEach(§ -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

// 重用filters

System.out.println("年龄大于 24岁的女性 Java programmers:");

javaProgrammers.stream()

.filter(ageFilter)

.filter(genderFilter)

.forEach(§ -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

复制代码
??使用limit方法,可以限制结果集的个数:

System.out.println("最前面的3个 Java programmers:");

javaProgrammers.stream()

.limit(3)

.forEach(§ -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

System.out.println("最前面的3个女性 Java programmers:");

javaProgrammers.stream()

.filter(genderFilter)

.limit(3)

.forEach(§ -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

复制代码
??排序呢? 我们在stream中能处理吗? 答案是肯定的。 在下面的例子中,我们将根据名字和薪水排序Java程序员,放到一个list中,然后显示列表:

System.out.println("根据 name 排序,并显示前5个 Java programmers:");

List sortedJavaProgrammers = javaProgrammers

.stream()

.sorted((p, p2) -> (p.getFirstName().compareTo(p2.getFirstName())))

.limit(5)

.collect(toList());

sortedJavaProgrammers.forEach(§ -> System.out.printf("%s %s; %n", p.getFirstName(), p.getLastName()));

System.out.println("根据 salary 排序 Java programmers:");

sortedJavaProgrammers = javaProgrammers

.stream()

.sorted( (p, p2) -> (p.getSalary() - p2.getSalary()) )

.collect( toList() );

sortedJavaProgrammers.forEach(§ -> System.out.printf("%s %s; %n", p.getFirstName(), p.getLastName()));

复制代码
??如果我们只对最低和最高的薪水感兴趣,比排序后选择第一个/最后一个 更快的是min和max方法:

System.out.println("工资最低的 Java programmer:");

Person pers = javaProgrammers

.stream()

.min((p1, p2) -> (p1.getSalary() - p2.getSalary()))

.get()

System.out.printf("Name: %s %s; Salary: $%,d.", pers.getFirstName(), pers.getLastName(), pers.getSalary())

System.out.println("工资最高的 Java programmer:");

Person person = javaProgrammers

.stream()

.max((p, p2) -> (p.getSalary() - p2.getSalary()))

.get()

System.out.printf("Name: %s %s; Salary: $%,d.", person.getFirstName(), person.getLastName(), person.getSalary())

复制代码
??上面的例子中我们已经看到 collect 方法是如何工作的。 结合 map 方法,我们可以使用 collect 方法来将我们的结果集放到一个字符串,一个 Set 或一个TreeSet中:

System.out.println("将 PHP programmers 的 first name 拼接成字符串:");

String phpDevelopers = phpProgrammers

.stream()

.map(Person::getFirstName)

.collect(joining(" ; ")); // 在进一步的操作中可以作为标记(token)

System.out.println("将 Java programmers 的 first name 存放到 Set:");

Set javaDevFirstName = javaProgrammers

.stream()

.map(Person::getFirstName)

.collect(toSet());

System.out.println("将 Java programmers 的 first name 存放到 TreeSet:");

TreeSet javaDevLastName = javaProgrammers

.stream()

.map(Person::getLastName)

.collect(toCollection(TreeSet::new));

复制代码
??Streams 还可以是并行的(parallel)。 示例如下:

System.out.println("计算付给 Java programmers 的所有money:");

int totalSalary = javaProgrammers

.parallelStream()

.mapToInt(p -> p.getSalary())

.sum();

复制代码
??我们可以使用summaryStatistics方法获得stream 中元素的各种汇总数据。 接下来,我们可以访问这些方法,比如getMax, getMin, getSum或getAverage:
数据结构与算法

这一块在笔试、面试的代码题中考核较多,其中常考的数据结构主要有:数组、链表、队列、栈、Set、Map、哈希表等 ,不同数据结构有不同的方法以及储存原理,这些算是技术岗的必备知识。算法部分主要分为两大块,排序算法与一些其他算法题

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

排序算法根据考频高低主要有:快速排序、归并排序、堆排序、冒泡排序、插入排序、选择排序、希尔排序、桶排序、基数排序、Timsort这十种,这类考核点要么是算法的时间、空间复杂度、稳定度,要么是直接手写代码,故在理解算法原理的同时,对JS语言版的排序算法代码也要加强记忆。

  • 二叉树层序遍历
  • B 树的特性,B 树和 B+树的区别
  • 尾递归
  • 如何写一个大数阶乘?递归的方法会出现什么问题?
  • 把多维数组变成一维数组的方法
  • 知道的排序算法 说一下冒泡快排的原理
  • Heap 排序方法的原理?复杂度?
  • 几种常见的排序算法,手写
  • 数组的去重,尽可能写出多个方法
  • 如果有一个大的数组,都是整型,怎么找出最大的前 10 个数
  • 知道数据结构里面的常见的数据结构
  • 找出数组中第 k 大的数组出现多少次,比如数组【1,2, 4,4,3,5】第二大的数字是 4,出现两次,所以返回 2
  • 合并两个有序数组
  • 给一个数,去一个已经排好序的数组中寻找这个数的位 置(通过快速查找,二分查找)
  • 尾递归
  • 如何写一个大数阶乘?递归的方法会出现什么问题?
  • 把多维数组变成一维数组的方法
  • 知道的排序算法 说一下冒泡快排的原理
  • Heap 排序方法的原理?复杂度?
  • 几种常见的排序算法,手写
  • 数组的去重,尽可能写出多个方法
  • 如果有一个大的数组,都是整型,怎么找出最大的前 10 个数
  • 知道数据结构里面的常见的数据结构
  • 找出数组中第 k 大的数组出现多少次,比如数组【1,2, 4,4,3,5】第二大的数字是 4,出现两次,所以返回 2
  • 合并两个有序数组
  • 给一个数,去一个已经排好序的数组中寻找这个数的位 置(通过快速查找,二分查找)

外链图片转存中...(img-FsPLBdQn-1715424630639)

相关推荐
wdfk_prog几秒前
lely-canopen-rtt:为什么推荐在 RT-Thread 上使用 Lely CANopen 构建主站
java·运维·缓存·docker·容器
Token掘金室5 分钟前
JSON模式结构化输出报错
java·服务器·json
秋饼11 分钟前
Spring AI 2.0 接入 DeepSeek V4.1 Flash 生产级实战
java·ai·技术分享·后端开发
IT枫斗者枫哥11 分钟前
Java 分批导出仍然 OOM?用 32 MiB 堆复现三种 CSV 写法
java
shehuiyuelaiyuehao20 分钟前
算法43,外观数列,模拟算法+双指针
java·算法
妖孽白小白34 分钟前
el-select的内容续写实现
前端·vue.js·elementui
不可能片场44 分钟前
Electron 主进程热补丁:单行 JS 安全打法
前端·electron
lhldsg1 小时前
多商户团购系统源码:技术架构选型与二次开发实战指南
java·小程序·架构
亦暖筑序1 小时前
AgentScope Java 实战:@Tool 方法里到底该不该写业务逻辑?
java·agent·ai编程
梨想橙汁1 小时前
Pinia 状态管理实战:定义 Store、修改数据、模块拆分
前端·vue.js