2024.11.25 周一
周末回了趟家,没有背八股也没有做项目,大部分时间在休息,少部分时间在刷力扣。
八股
Java8 新特性
Java 8 有哪些新特性?
Java8 主要新增以下几个特性:
-
Lambda 表达式 − Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
-
方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
-
默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。
-
新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
-
Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
-
Date Time API − 加强对日期与时间的处理。
-
Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
-
Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。
Stream API
案例1:过滤并收集满足条件的元素
问题场景:从一个列表中筛选出所有长度大于3的字符串,并收集到一个新的列表中。(本质上是将列表中的元素作统一处理,再收集新列表中)// 创建案例列表 List<String> originalList = Arrays.asList("apple","fig","banana","kiwi"); // Stream API 应用 List<String> filteredList = originalList.stream() //创建 stream流 .filter(s -> s.length() > 3) //使用filter筛选长度大于3的字符串 .collect(Collectors.toList()); //将结果收集到一个新的列表中
案例2:计算列表中所有数字的总和
问题场景:计算列表中所有数字的总和。// 创建案例列表 List<Integer> numbers = Arrays.asList(1,2,3,4,5); // Stream API 应用 int sum = numbers.stream() //创建 stream流 .mapToInt(Integer::intValue) .sum();
通过Stream API,我们可以先使用
.mapToInt()
将Integer流
转换为IntStream
(这是为了高效处理基本类型),然后直接调用.sum()
方法来计算总和,极大地简化了代码。
Lambda表达式
Lambda 表达式是一个匿名函数,java 8 允许把函数作为参数传递进方法中。
匿名内部类只重写了接口的一个方法,且只有一个方法需要重写,即只要方法的参数是函数式接口都能使用 Lambda 表达式。
常见的函数式接口案例:
Runnable
接口
以下代码示例中,定义了一个新的Thread
对象,并将一个实现了Runnable
接口的匿名内部类作为参数传递给它
new Thread(new Runnable(){
@Overrdie
public void run() {
System.out.println("The runable now is using!");
}
}).start();
-----------------Lambda应用------------------
new Thread(() -> System.out.println("The runable now is using!")).start();
Comparator
接口
List<Integer> strings = Arrays.asList(1, 2, 3);
Collections.sort(strings, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;}
});
-----------------Lambda应用一------------------
Collections.sort(strings, (Integer o1, Integer o2) -> o1 - o2);
-----------------Lambda应用二------------------
Comparator<Integer> comparator = (Integer o1, Integer o2) -> o1 - o2;
Collections.sort(strings, comparator);
Listener
接口
JButton button = new JButton();
button.addItemListener(new ItemListener(){
@Override
public void itemStateChanged(ItemEvent e) {
e.getItem();}
});
-----------------Lambda应用------------------
button.addItemListener(e -> e.getItem());
Java 8 允许使用 ::
关键字来传递方法或者构造函数引用,无论如何,表达式返回的类型必须是 functional-interface
。
自定义函数式接口:
@FunctionalInterface
public interface LambdaInterface {
void f();
}
public class LambdaClass{
public static void forEg(){
// 该例子中实现 lambdaInterfaceDemo 通过 lambda表达式 传参并执行
lambdaInterfaceDemo(() -> System.out.println("自定义函数式接口"));
}
//该方法的参数 是 函数式接口
static void lambdaInterfaceDemo(LamdaInterface i){
i.f();
}
}
算法
53.最大子数组和
56.合并区间
项目
苍穹外卖-Day9
String.join()
在Java中,String.join 是一个静态方法,用于将多个字符串连接成一个字符串,并可以使用指定的分隔符分隔这些字符串。这个方法在Java 8及以后的版本中引入。
public static String join(CharSequence delimiter, CharSequence... elements)
delimiter
:用于分隔元素的字符串。elements
:一个可变参数,可以是字符串数组或者实现了CharSequence
接口的对象。
项目中通过该函数将一个字符串列表拼接成一个新的字符串。
private String getOrderDishesStr(Orders orders) {
//查询订单菜品详情
List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(orders.getId());
//将每一条订单菜品信息拼接为字符串(格式:宫保鸡丁*3;)
List<String> orderDishList = orderDetailList.stream().map(x -> {
String orderDish = x.getName() + "*" + x.getNumber() + ";";
return orderDish;
}).collect(Collectors.toList());
//将该订单对应的所有菜品信息拼接在一起
return String.join("", orderDishList);
}
@RestController("adminOrderController")
项目中存在两个同名的Controller时,IDEA会报错,此时通过为两个Controller注释后面设置不同的字符串就可以避免报错:
@RestController("adminOrderController")
@RestController("userOrderController")