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)]

相关推荐
程序员徐师兄几秒前
Java 基于微信小程序的高校失物招领平台小程序(附源码,文档)
java·微信小程序·小程序·失物招领小程序·高校失物招领小程序
tekin35 分钟前
Vue.js组件开发
前端·javascript·vue.js·vue·vue组件·vue.js组件开发
DEARM LINER39 分钟前
RabbitMQ 可靠性投递
java·分布式·后端·rabbitmq·ruby
大雄野比39 分钟前
Vue3.5常用特性整理
前端·javascript·vue.js
m0_5287238139 分钟前
如何利用i18n实现国际化
前端·javascript·vue.js
一个处女座的程序猿O(∩_∩)O1 小时前
React+AI 技术栈(2025 版)
前端·人工智能·react.js
恰小面包1 小时前
react使用DatePicker日期选择器
前端·react.js·前端框架
engchina1 小时前
React中key值的正确使用指南:为什么需要它以及如何选择
前端·react.js·前端框架
engchina1 小时前
React组件开发技巧:如何优雅地传递Props?
前端·javascript·react.js
偷光1 小时前
Vue3 对比 React18—不只是技术选择
前端·javascript·react.js