java8(jdk1,Android面试宝典,腾讯面试算法题

class Phone implements MobilePhone, HuaWei {

public void print(){

MobilePhone.super.print();

HuaWei.super.print();

HuaWei.foldingScreen();

}

}

三、方法引用

方法引用使得开发者可以直接引用现存的方法、Java类的构造方法或者实例对象。方法引用和Lambda表达式配合使用,使得java类的构造方法看起来更加紧凑简洁,减少冗余代码。

方法引用通过方法的名字来指向一个方法

方法引用使用一对冒号 ::

4 种不同方法的引用:

@FunctionalInterface

public interface Supplier {

T get();

}

class Car {

//Supplier是jdk1.8的接口,这里和Lambda表达式一起使用

public static Car create(final Supplier supplier) {

return supplier.get();

}

public static void collide(final Car car) {

System.out.println("Collided " + car.toString());

}

public void follow(final Car another) {

System.out.println("Following the " + another.toString());

}

public void repair() {

System.out.println("Repaired " + this.toString());

}

}

  • **构造器引用:**它的语法是Class::new,或者更一般的Class< T >::new实例如下:

final Car car = Car.create( Car::new );

final List< Car > cars = Arrays.asList( car );

  • **静态方法引用:**它的语法是Class::static_method,实例如下:

cars.forEach( Car::collide );

  • **特定类的任意对象的方法引用:**它的语法是Class::method实例如下:

cars.forEach( Car::repair );

  • **特定对象的方法引用:**它的语法是instance::method实例如下:

final Car police = Car.create( Car::new );

cars.forEach( police::follow );

示例:

public class Java8Test {

public static void main(String args[]){

List students = new ArrayList();

students.add(“张三”);

students.add(“李四”);

students.add(“王五”);

students.add(“赵六”);

students.add(“田七”);

// 将System.out::println方法作为静态方法来引用

students.forEach(System.out::println);

}

}

四、重复注解

对注解概念不太清楚的朋友,建议先看这篇文章【Java的注解】:https://blog.csdn.net/qq15577969/article/details/119673933

在Java 5中使用注解有一个限制,即相同的注解在同一位置只能声明一次,Java 8引入重复注解,这样相同的注解在同一地方也可以声明多次;Java 8在编译器层做了优化,相同注解会以集合的方式保存,因此底层的原理并没有变化。

重复注解机制本身需要用@Repeatable注解,示例代码:

package com.javacodegeeks.java8.repeatable.annotations;

import java.lang.annotation.ElementType;

import java.lang.annotation.Repeatable;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

public class RepeatingAnnotations {

@Target( ElementType.TYPE )

@Retention( RetentionPolicy.RUNTIME )

public @interface Filters {

Filter[] value();

}

@Target( ElementType.TYPE )

@Retention( RetentionPolicy.RUNTIME )

@Repeatable( Filters.class )

public @interface Filter {

String value();

};

@Filter( “filter1” )

@Filter( “filter2” )

public interface Filterable {

}

public static void main(String[] args) {

for( Filter filter: Filterable.class.getAnnotationsByType( Filter.class ) ) {

System.out.println( filter.value() );

}

}

}

这里的Filter类使用@Repeatable(Filters.class)注解修饰,而Filters是存放Filter注解的容器,编译器尽量对开发者屏蔽这些细节。这样,Filterable接口可以用两个Filter注解注释。

另外,反射API提供了一个新的方法:getAnnotationsByType(),可以返回某个类型的重复注解,例如Filterable.class.getAnnoation(Filters.class)将返回两个Filter实例,输出到控制台的内容如下所示:

filter1

filter2

五、扩展注解的支持

Java 8扩展了注解的上下文,几乎可以为任何东西添加注解,包括局部变量、泛型类、父类与接口的实现,连方法的异常也能添加注解。

六、Optional

Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

Java应用中最常见的bug就是空指针异常,Optional 类的引入很好的解决空指针异常,从而避免源码被各种null检查污染,以便开发者写出更加整洁的代码。

1、类声明

以下是一个 java.util.Optional 类的声明:

public final class Optional

extends Object

2、类方法 **(**这些方法是从 java.lang.Object 类继承来的)

序号方法 & 描述
1static <T> Optional<T> empty()

返回空的 Optional 实例。

2boolean equals(Object obj)

判断其他对象是否等于 Optional。

3Optional<T> filter(Predicate<? super <T> predicate)

如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。

4<U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)

如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional

5T get()

如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException

6int hashCode()

返回存在值的哈希码,如果值不存在 返回 0。

7void ifPresent(Consumer<? super T> consumer)

如果值存在则使用该值调用 consumer , 否则不做任何事情。

8boolean isPresent()

如果值存在则方法会返回true,否则返回 false。

9<U>Optional<U> map(Function<? super T,? extends U> mapper)

如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。

10static <T> Optional<T> of(T value)

返回一个指定非null值的Optional。

11static <T> Optional<T> ofNullable(T value)

如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。

12T orElse(T other)

如果存在该值,返回值, 否则返回 other。

13T orElseGet(Supplier<? extends T> other)

如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。

14<X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)

如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常

15String toString()

返回一个Optional的非空字符串,用来调试

3、Optional简单实例

import java.util.Optional;

public class Java8Test {

public static void main(String args[]){

Java8Test java8Test = new Java8Test();

// Optional.ofNullable - 允许传递为 null 参数

Optional a = Optional.ofNullable(null);

// Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException

Optional b = Optional.of(new Integer(10));

java8Test.print(a,b);

}

public void print(Optional a, Optional b){

// 1、Optional.isPresent - 判断值是否存在

System.out.println("第一个参数值存在: " + a.isPresent());

System.out.println("第二个参数值存在: " + b.isPresent());

// 2、Optional.orElse - 如果值存在,返回它,否则返回默认值

Integer value1 = a.orElse(new Integer(0));

System.out.println("第一个值: " + value1);

//3、Optional.get - 获取值,值需要存在

Integer value2 = b.get();

System.out.println( “第二个值:”+ value2);

}

}

**七、Stream(**流)

1、什么是 Stream?

Stream API(java.util.stream)是把真正的函数式编程风格引入到Java库中,这是目前为止最大的一次对Java库的完善,以便开发者能够写出高效率、干净、简洁的代码。其实简单来说可以把Stream理解为MapReduce,当然Google的MapReduce的灵感也是来自函数式编程,它其实是一连串支持连续、并行聚集操作的元素,从语法上看,也很像linux的管道、或者链式编程,代码写起来简洁明了!

Stream(流)是一个来自数据源的元素队列并支持聚合操作,Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。

数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。

聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

和以前的Collection操作不同, Stream操作还有两个基础的特征:

Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。

内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

流程图:

±-------------------+ ±-----+ ±-----+ ±–+ ±------+

| stream of elements ±----> |filter±> |sorted±> |map±> |collect|

±-------------------+ ±-----+ ±-----+ ±–+ ±------+

以上的流程转换为 Java 代码为:

List transactionsIds =

widgets.stream()

.filter(b -> b.getColor() == RED)

.sorted((x,y) -> x.getWeight() - y.getWeight())

.mapToInt(Widget::getWeight)

.sum();

2、java8生成流的两种方法:

  • stream() − 为集合创建串行流。
forEach

迭代流中的每个数据,以下代码片段使用 forEach 输出了10个随机数:

Random random = new Random();

random.ints().limit(10).forEach(System.out::println);map

用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数:

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

// 获取对应的平方数

List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());filter

用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串:

List<String>strings = Arrays.asList(“abc”, “”, “bc”, “efg”, “abcd”,“”, “jkl”);

// 获取空字符串的数量

long count = strings.stream().filter(string -> string.isEmpty()).count();limit

用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 10 条数据:

Random random = new Random();

random.ints().limit(10).forEach(System.out::println);

sorted

用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:

Random random = new Random();

random.ints().limit(10).sorted().forEach(System.out::println);

Collectors

Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:

List<String>strings = Arrays.asList(“abc”, “”, “bc”, “efg”, “abcd”,“”, “jkl”);

List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

System.out.println("筛选列表: " + filtered);

String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));

System.out.println("合并字符串: " + mergedString);

统计

另外,一些产生统计结果的收集器也非常有用。它们主要用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();

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

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

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

System.out.println("平均数 : " + stats.getAverage());

  • parallelStream() − 为集合创建并行流。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

推荐学习资料


  • 脑图
    360°全方位性能调优


    由于文章篇幅问题点击链接查看详细文章以及获取学习笔记:GitHub

图片转存中…(img-dlyxpA3i-1710841792194)]
[外链图片转存中…(img-cCfge0QW-1710841792195)]
[外链图片转存中…(img-oQhERRcA-1710841792195)]
[外链图片转存中…(img-Cp2Tv8JE-1710841792196)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-6XYgCkLO-1710841792196)]

推荐学习资料


  • 脑图
    [外链图片转存中…(img-lyd2LXTl-1710841792197)]
    [外链图片转存中…(img-Y2Y1yXBX-1710841792197)]
    [外链图片转存中…(img-EQcSujof-1710841792198)]
    由于文章篇幅问题点击链接查看详细文章以及获取学习笔记:GitHub
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值