资讯详情

资讯详情

lambda,Optional,Stream最重要也是最常用

这三个是 Java 8 面试里最常被放在一起问的可以按“Lambda 写行为、Stream 处理集合、Optional 处理空值”来记。1. Lambda 表达式作用简化匿名内部类让“一段行为”可以像参数一样传进去。// 传统写法newThread(newRunnable(){Overridepublicvoidrun(){System.out.println(hello);}}).start();// Lambda 写法newThread(()-System.out.println(hello)).start();关键点只能用于函数式接口也就是只有一个抽象方法的接口。常用内置接口PredicateT接收参数返回boolean比如x - x 10FunctionT,R接收 T返回 R比如s - s.length()ConsumerT接收参数无返回值比如s - System.out.println(s)SupplierT无参数返回 T比如() - new User()Lambda 捕获的外部局部变量必须是final或“事实上不可变”。面试可以答Lambda 本质是函数式接口的实例用来简化匿名内部类。2. Stream 流作用对集合做过滤、转换、排序、统计、分组替代繁琐的for循环。ListStringnamesusers.stream().filter(u-u.getAge()18).map(User::getName).sorted().collect(Collectors.toList());三个阶段创建流list.stream()、Stream.of()中间操作filter、map、flatMap、sorted、distinct、limit、skip终止操作forEach、collect、count、reduce、max、min、anyMatch中间操作是“加工”终端操作是“出锅”。filter、map、flatMap、sorted 都在加工collect、count、forEach、findFirst 就是出锅拿结果特点Stream不存储数据只是对数据源做计算。中间操作是惰性求值只有遇到终止操作才会真正执行。Stream不会修改原集合。Stream只能消费一次用完不能再次使用。面试常问map和flatMap区别map是一对一转换flatMap是一对多再扁平化比如ListListString转成ListString。3. Optional作用优雅处理可能为null的值减少if (obj ! null)。OptionalUseruserOptOptional.ofNullable(user);StringnameuserOpt.map(User::getName).orElse(未知);// 通常写法如下少一个变量命名StringnameOptional.ofNullable(user).map(User::getName).orElse(未知名字);常用方法Optional.of(value)值不能为null否则抛异常Optional.ofNullable(value)允许nullisPresent()判断是否有值ifPresent()有值才执行orElse()为空给默认值orElseGet()为空时执行逻辑生成默认值orElseThrow()为空抛异常面试坑点orElse()和orElseGet()区别orElse()无论是否为空都会执行orElseGet()只有为空时才执行。所以orElseGet()更适合生成默认值。面试一句话总结Lambda 简化匿名内部类Stream 做集合流式处理Optional 用来避免空指针。这三个经常一起出现最好各准备一个代码示例。需要我详细讲讲Stream中map和flatMap的区别并写个代码示例帮你理解吗你前面已经基本掌握了这三个东西现在可以按“Lambda 写行为Stream 处理集合Optional 处理空值”来记。速记版概念作用常见写法Lambda简化函数式接口实现(x) - x 10Stream链式处理集合filter / map / collectOptional避免空指针map / orElse / orElseThrow组合示例OptionalStringnameusers.stream().filter(u-u.getAge()18).map(User::getName).findFirst();Stringresultname.orElse(未知用户);这里三个都用上了u - u.getAge() 18是Lambdastream / filter / map / findFirst是StreamfindFirst返回Optional用orElse兜底是Optional。面试高频坑点filter是中间操作不会立即执行collect / count / forEach是终止操作才会真正触发计算。Stream 只能消费一次不能重复使用。map是一对一转换flatMap是一对多再扁平化。Optional.of()传 null 会抛异常Optional.ofNullable()才允许 null。orElse()不管有没有值都会执行orElseGet()只有为空时才执行。Lambda 只能用于函数式接口也就是只有一个抽象方法的接口。如果你是想练代码题可以重点练这几类集合过滤排序、去重统计、分组、转 Map、Optional 链式判空。需要的话我可以直接出几道带答案的练习题。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →