2024年Android最全Lamb入门,Android开发社招面试总结

总结

最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上我整理的几十套腾讯、字节跳动,京东,小米,头条、阿里、美团等公司19年的Android面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

技术进阶之路很漫长,一起共勉吧~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

);

// 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) -> (p.getSalary() > 1400))

      .forEach((p) -> 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((p) -> System.out.printf("%s %s; ", p.getFirstName(), p.getLastName()));

// 重用filters

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

javaProgrammers.stream()

      .filter(ageFilter)

      .filter(genderFilter)

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

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

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

javaProgrammers.stream()

      .limit(3)

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

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

javaProgrammers.stream()

      .filter(genderFilter)

      .limit(3)

      .forEach((p) -> 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:

//计算 count, min, max, sum, and average for numbers

List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

IntSummaryStatistics stats = numbers

      .stream()

      .mapToInt((x) -> x)

      .summaryStatistics();

System.out.println("List中最大的数字 : " + stats.getMax());

System.out.println("List中最小的数字 : " + stats.getMin());

System.out.println("所有数字的总和 : " + stats.getSum());

System.out.println("所有数字的平均值 : " + stats.getAverage());

OK,就这样,希望你喜欢它!

总结

在本文中,我们学会了使用lambda表达式的不同方式,从基本的示例,到使用lambdas和streams的复杂示例。 此外,我们还学习了如何使用lambda表达式与Comparator 类来对Java集合进行排序。




  



## 写在最后

本次我的分享也接近尾声了,感谢你们在百忙中花上一下午来这里聆听我的宣讲,希望在接下来的日子,我们共同成长,一起进步!!!

最后放上一个大概的Android学习方向及思路(详细的内容太多了~),提供给大家:

![](https://img-blog.csdnimg.cn/img_convert/f434d8bdebc3ce06e248487b33fb95b0.webp?x-oss-process=image/format,png)

对于程序员来说,要学习的知识内容、技术有太多太多,这里就先放上一部分,其他的内容有机会在后面的文章向大家呈现出来,不过我自己所有的学习资料都整理成了一个文档,一直在不断学习,希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

**为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!**

Android架构师之路很漫长,一起共勉吧!

如果你觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。

![](https://img-blog.csdnimg.cn/img_convert/fa6e68bdda21d5d2812748e7096b1193.webp?x-oss-process=image/format,png)



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!**

Android架构师之路很漫长,一起共勉吧!

如果你觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。

[外链图片转存中...(img-AI6iVcKZ-1715622958591)]



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值