Lambda表达式
区间合并,这道题目,我一开始使用双端队列解决,后来发现过度设计了,直接排序就好了,顺便复习一下java的lambda-使用lambda实现排序功能
语法糖: 指那些不影响功能但提升可读性的语法特性,但是使用要适度哦
class Solution {
public int[][] merge(int[][] intervals) {
if (intervals == null || intervals.length == 0) {
return new int[0][0];
}
// 按区间起始位置排序
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
List<int[]> merged = new ArrayList<>();
merged.add(intervals[0]);
for (int i = 1; i < intervals.length; i++) {
int[] last = merged.get(merged.size() - 1);
if (intervals[i][0] <= last[1]) {
// 合并区间
last[1] = Math.max(last[1], intervals[i][1]);
} else {
merged.add(intervals[i]);
}
}
return merged.toArray(new int[merged.size()][]);
}
}
lambda 可以简化匿名内部类的书写
/**
* @author 一只咸鱼的大厂梦-hxw
* @date 2025-06-05 21:29
*/
public class Main {
public static void main(String[] args) {
Integer[] arr = {2, 3, 1, 5, 6, 7, 8, 4, 9};
/** 正儿八经的排序
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2; // 从小到达排序
}
});
System.out.println(Arrays.toString(arr));
**/
// 使用lambda 表达式优化匿名内部类(看一下代码编写规则就明白了)
Arrays.sort(arr, (Integer o1, Integer o2 ) -> {
return o1 - o2;
});
System.out.println(Arrays.toString(arr));
// 输出[1, 2, 3, 4, 5, 6, 7, 8, 9]
}
}
lambda表达式是函数式思想的体现
函数式思想
面向对象:例如下面的例子,先找到对象,再让对象做事情
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2; // 从小到达排序
}
});
函数式编程,忽略面向对象的复杂语法,强调做什么而不是谁去做,更加关注逻辑
/**
调用一个方法的时候, 如果方法的形参是一个接口,就要传递这个接口的实现类对象
如果实现类对象要用到一次, 就可以用匿名内部类的形式进行书写
**/
Arrays.sort(arr, (Integer o1, Integer o2 ) -> {
return o1 - o2;
});
lambda表达式格式
回答这道算法题目, 二维的例子
Arrays.sort(arr, Comparator.comparingInt(b->b[0]));
// 等价于
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});