Java基础:JDK8新特性,2024年Java岗位BAT大厂面试题知识点小结

本文深入探讨Java 8的新特性,重点关注Lambda表达式和Stream API的使用。首先介绍了Lambda表达式的抽象方法如`apply`、`andThen`,并提供实例演示其在数据过滤、映射和转换中的应用。接着,详细讲解了Stream API如何简化传统集合的遍历操作,包括`forEach`、`filter`、`map`等方法,并对比了传统循环与Stream API的差异。此外,文章还涵盖了Stream的组合方法`concat`以及方法引用的概念,强调了方法引用在提升代码简洁性和效率上的作用。最后,通过实例展示了如何利用Stream API处理集合元素,包括筛选、合并、转换等多个步骤,对比了传统for循环与Stream方式的实现差异。
摘要由CSDN通过智能技术生成

default Predicate negate() {

return (t) ‐> !test(t);

}

从实现中很容易看出,它是执行了test方法之后,对结果boolean值进行“!”取反而已。一定要在test方法调用之前调用negate 方法,正如andor 方法一样:

package com.itheima.demo06.Predicate;

import java.util.function.Predicate;

/*

需求:判断一个字符串长度是否大于5

如果字符串的长度大于5,那返回false

如果字符串的长度不大于5,那么返回true

所以我们可以使用取反符号!对判断的结果进行取反

Predicate接口中有一个方法negate,也表示取反的意思

default Predicate negate() {

return (t) -> !test(t);

}

*/

public class Demo04Predicate_negate {

/*

定义一个方法,方法的参数,传递一个字符串

使用Predicate接口判断字符串的长度是否大于5

*/

public static boolean checkString(String s, Predicate pre){

//return !pre.test(s);

return pre.negate().test(s);//等效于return !pre.test(s);

}

public static void main(String[] args) {

//定义一个字符串

String s = “abc”;

//调用checkString方法,参数传递字符串和Lambda表达式

boolean b = checkString(s,(String str)->{

//判断字符串的长度是否大于5,并返回结果

return str.length()>5;

});

System.out.println(b);

}

}

3.6 练习:集合信息筛选


题目

数组当中有多条“姓名+性别”的信息如下,请通过Predicate 接口的拼装将符合要求的字符串筛选到集合ArrayList中,需要同时满足两个条件:

  1. 必须为女生;

  2. 姓名为4个字。

public class DemoPredicate {

public static void main(String[] args) {

String[] array = { “迪丽热巴,女”, “古力娜扎,女”, “马尔扎哈,男”, “赵丽颖,女” };

}

}

解答

package com.itheima.demo06.Predicate;

import java.util.ArrayList;

import java.util.function.Predicate;

/*

练习:集合信息筛选

数组当中有多条“姓名+性别”的信息如下,

String[] array = { “迪丽热巴,女”, “古力娜扎,女”, “马尔扎哈,男”, “赵丽颖,女” };

请通过Predicate接口的拼装将符合要求的字符串筛选到集合ArrayList中,

需要同时满足两个条件:

  1. 必须为女生;

  2. 姓名为4个字。

分析:

1.有两个判断条件,所以需要使用两个Predicate接口,对条件进行判断

2.必须同时满足两个条件,所以可以使用and方法连接两个判断条件

*/

public class Demo05Test {

/*

定义一个方法

方法的参数传递一个包含人员信息的数组

传递两个Predicate接口,用于对数组中的信息进行过滤

把满足条件的信息存到ArrayList集合中并返回

*/

public static ArrayList filter(String[] arr,Predicate pre1,Predicate pre2){

//定义一个ArrayList集合,存储过滤之后的信息

ArrayList list = new ArrayList<>();

//遍历数组,获取数组中的每一条信息

for (String s : arr) {

//使用Predicate接口中的方法test对获取到的字符串进行判断

boolean b = pre1.and(pre2).test(s);

//对得到的布尔值进行判断

if(b){

//条件成立,两个条件都满足,把信息存储到ArrayList集合中

list.add(s);

}

}

//把集合返回

return list;

}

public static void main(String[] args) {

//定义一个储存字符串的数组

String[] array = { “迪丽热巴,女”, “古力娜扎,女”, “马尔扎哈,男”, “赵丽颖,女” };

//调用filter方法,传递字符串数组和两个Lambda表达式

ArrayList list = filter(array,(String s)->{

//获取字符串中的性别,判断是否为女

return s.split(“,”)[1].equals(“女”);

},(String s)->{

//获取字符串中的姓名,判断长度是否为4个字符

return s.split(“,”)[0].length()==4;

});

//遍历集合

for (String s : list) {

System.out.println(s);

}

}

}

3.7 Function接口


java.util.function.Function<T,R> 接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件。

抽象方法:apply

Function接口中最主要的抽象方法为: R apply(T t),根据类型T的参数获取类型R的结果。使用的场景例如:将String类型转换为Integer类型。

package com.itheima.demo07.Function;

import java.util.function.Function;

/*

java.util.function.Function<T,R>接口用来根据一个类型的数据得到另一个类型的数据,

前者称为前置条件,后者称为后置条件。

Function接口中最主要的抽象方法为:R apply(T t),根据类型T的参数获取类型R的结果。

使用的场景例如:将String类型转换为Integer类型。

*/

public class Demo01Function {

/*

定义一个方法

方法的参数传递一个字符串类型的整数

方法的参数传递一个Function接口,泛型使用<String,Integer>

使用Function接口中的方法apply,把字符串类型的整数,转换为Integer类型的整数

*/

public static void change(String s, Function<String,Integer> fun){

//Integer in = fun.apply(s);

int in = fun.apply(s);//自动拆箱 Integer->int

System.out.println(in);

}

public static void main(String[] args) {

//定义一个字符串类型的整数

String s = “1234”;

//调用change方法,传递字符串类型的整数,和Lambda表达式

change(s,(String str)->{

//把字符串类型的整数,转换为Integer类型的整数返回

return Integer.parseInt(str);

});

//优化Lambda

change(s,str->Integer.parseInt(str));

}

}

当然,最好是通过方法引用的写法。

默认方法:andThen

Function 接口中有一个默认的andThen方法,用来进行组合操作。JDK源代码如:

default Function<T, V> andThen(Function<? super R, ? extends V> after) {

Objects.requireNonNull(after);

return (T t) ‐> after.apply(apply(t));

}

该方法同样用于“先做什么,再做什么”的场景,和Consumer 中的andThen 差不多:

package com.itheima.demo07.Function;

import java.util.function.Function;

/*

Function接口中的默认方法andThen:用来进行组合操作

需求:

把String类型的"123",转换为Inteter类型,把转换后的结果加10

把增加之后的Integer类型的数据,转换为String类型

分析:

转换了两次

第一次是把String类型转换为了Integer类型

所以我们可以使用Function<String,Integer> fun1

Integer i = fun1.apply(“123”)+10;

第二次是把Integer类型转换为String类型

所以我们可以使用Function<Integer,String> fun2

String s = fun2.apply(i);

我们可以使用andThen方法,把两次转换组合在一起使用

String s = fun1.andThen(fun2).apply(“123”);

fun1先调用apply方法,把字符串转换为Integer

fun2再调用apply方法,把Integer转换为字符串

*/

public class Demo02Function_andThen {

/*

定义一个方法

参数串一个字符串类型的整数

参数再传递两个Function接口

一个泛型使用Function<String,Integer>

一个泛型使用Function<Integer,String>

*/

public static void change(String s, Function<String,Integer> fun1,Function<Integer,String> fun2){

String ss = fun1.andThen(fun2).apply(s);

System.out.println(ss);

}

public static void main(String[] args) {

//定义一个字符串类型的整数

String s = “123”;

//调用change方法,传递字符串和两个Lambda表达式

change(s,(String str)->{

//把字符串转换为整数+10

return Integer.parseInt(str)+10;

},(Integer i)->{

//把整数转换为字符串

return i+“”;

});

//优化Lambda表达式

change(s,str->Integer.parseInt(str)+10,i->i+“”);

}

}

第一个操作是将字符串解析成为int数字,第二个操作是乘以10。两个操作通过andThen按照前后顺序组合到了一起。

请注意,Function的前置条件泛型和后置条件泛型可以相同。

3.8 练习:自定义函数模型拼接


题目

请使用Function进行函数模型的拼接,按照顺序需要执行的多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值