Java8新特性

89 阅读2分钟

lambda表达式

Java8对核心类库的改变主要包括集合类的API和新引入的流Stream,而这些都依赖于Java8支持的lambda表达式

lambda表达式概念:是一种表示匿名函数的方法,也叫闭包,核心就是拿参数去做操作

示例:(parameters) -> { statements; }

使用:它是将函数(也就是lambda表达式)作为一个方法的参数传递到方法中,一般用以简化接口实现

例如:

不使用lambda表达式:

 List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
 Collections.sort(names, new Comparator<String>() {
     @Override
     public int compare(String o1, String o2) {
         return o1.compareTo(o2);
     }
 });

使用lambda表达式:

 List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
 Collections.sort(names, (o1, o2) -> o1.compareTo(o2));

例子中使用names, (o1, o2) -> o1.compareTo(o2)表达式,这个表达式就相当于这个接口的实现,并且完成了里面的逻辑,所以对于只有单个抽象方法的接口,可以使用lambda表达式来实现接口

 public class Test04 {
     public static void main(String[] args) {
         //使用lambda表达式实现接口
         Test test = () -> {
             System.out.println("test");
         };
         test.test();
     }
 }
 ​
 interface Test{
     public void test();
 }

方法引用:用来简化Lambda表达式的语法,它允许你直接引用一个已经存在的方法或构造方法,而不需要在Lambda表达式中重复编写相同的代码

函数式接口

函数式接口是指只有一个抽象方法的接口,它们通常用于表示一种行为。

而Lambda表达式提供了一种编写函数式接口实现的简洁方式👌👌👌

来看这四种函数式接口:

  1. Supplier

    • 用途:提供(供应)一个值,通常用于延迟初始化或需要在运行时动态生成值的场景。

    • 示例:

       // 创建一个Supplier<String>的实例,用于生成随机字符串
       Supplier<String> randomStringSupplier = () -> "Random String " + System.currentTimeMillis();
       String randomString = randomStringSupplier.get(); // 获取一个随机字符串
      
  2. Consumer

    • 用途:消费(处理)一个值,通常用于执行副作用操作,如打印日志、修改状态等。

    • 示例:

       // 创建一个Consumer<String>的实例,用于打印字符串
       Consumer<String> printConsumer = (s) -> System.out.println(s);
       printConsumer.accept("Hello, World!"); // 输出: Hello, World!
      
  3. Function<T, R>

    • 用途:接受一个输入参数并返回一个结果,通常用于转换或映射操作。

    • 示例:

       // 创建一个Function<String, Integer>的实例,用于将字符串转换为长度
       Function<String, Integer> stringLength = s -> s.length();
       int length = stringLength.apply("Hello"); // 返回字符串"Hello"的长度
      
  4. Predicate

    • 用途:对一个值进行测试,返回布尔值,通常用于过滤或条件判断。

    • 示例:

       复制// 创建一个Predicate<String>的实例,用于判断字符串是否为空
       Predicate<String> isEmpty = s -> s == null || s.isEmpty();
       boolean isStringEmpty = isEmpty.test(""); // 返回true,因为空字符串满足条件
      

Optional类

判断对象是否为null的,一般配合orElse来完成属性的赋值

常用例子:

 Optional.ofNullable(lastData.getUpdateTimeInt()).orElse(0).longValue()

接口支持默认方法

默认方法给予我们修改接口而不破坏原来的实现类的结构提供了便利

为了减少修改接口带来的负担