在接口中新增default默认方法
- 向现有接口添加功能而不破坏向后兼容性
在JDK 1.8之前,接口只能定义抽象方法和常量,无法提供方法的具体实现。因此,当需要为接口添加新方法时,所有实现该接口的类都需要重新实现这些方法,这可能导致大量代码修改并破坏向后兼容性。
通过引入default关键字,开发者可以在接口中直接提供方法的默认实现,这样现有的实现类无需修改即可使用这些新方法。例如,在Collection接口中添加stream()方法后,所有实现Collection接口的类都可以直接调用该方法,而无需重新实现
- 与静态方法的区别
默认方法与静态方法的主要区别在于调用方式和作用范围。默认方法需要通过实例对象调用,而静态方法可以直接通过接口名调用。
- 避免破坏现有实现
默认方法的引入不会改变接口的抽象特性,即接口仍然保持其不可实例化的特点。同时,由于默认方法提供了实现,因此不会影响到那些未覆盖该方法的实现类
Stream流
创建流
-
通过集合创建流:
List<String> list = Arrays.asList("a", "b", "c"); Stream<String> stream = list.stream();
直接通过集合创建流 -
通过数组创建流:
String[] array = new String[]{"a", "b", "c"}; Stream<String> stream = Arrays.stream(array);
通过Arrays工具包中的重载stream方法实现数组创建流 -
使用
Stream.generate()
创建无限流:Stream<Integer> stream = Stream.generate(() -> new Random().nextInt()).limit(size);
通过Stream中的静态方法generate Stream流API的使用
scss
//使用generate 创建流
Stream<Integer> streamInteger = Stream.generate(() -> new Random().nextInt()).limit(100);
Stream<String> streamString = Stream.generate(() -> "hello" + new Random().nextInt()).limit(100);
kotlin
//过滤 filter(s->{
return s>= 0 ;//过滤条件,为true则元素留下,为false则过滤
})
// lambda表达式简化后
List<Integer> filteredList = streamInteger.filter(s -> s >= 0).toList();
ini
//排序sorted :默认升序 => 默认为:sorted((o1,o2) -> {return o1 - o2 ;})
List<Integer> ascList = filteredList.stream().sorted().toList();
//降序排列
List<Integer> descList1 = filteredList.stream().sorted((o1, o2) -> o2 - o1).toList();
List<String> collect = streamString.filter(s -> s.endsWith("0")).toList();
scss
//构建流
Stream<String> distinctPastList = Stream.generate(() -> "hello" + new Random().nextInt(10)).limit(100);
//去重
List<String> uniqueList = distinctPastList.distinct().toList();
System.out.println(uniqueList);
//构建流
List<Integer> numbers = Stream.generate(() -> new Random().nextInt(100)).limit(100).toList();
//求和
int sum = numbers.stream().mapToInt(Integer::intValue).sum();
System.out.println(sum);
//最大值
Optional<Integer> max = numbers.stream().max(Integer::compare);
//先判断max是否为空,再打印 原式为:max.ifPresent(s -> System.out.println(s))
max.ifPresent(System.out::println);
String concatenated = String.join("", collect);