Java新特性,从8-最新

一、Java8

1.Lambda表达式

Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
 

示例

public class Test1 {
    public static void main(String[] args) {
        MathOperation mathOperation=(a,b)->a + b;
        System.out.println(mathOperation.getSum(1,2));
    }
}
interface MathOperation {
    int getSum(int a, int b);
}

上面的例子中,我们创建了一个函数式接口 MathOperation,它定义了一个接受两个整数参数并返回他们和的结果的操作。然后,我们使用Lambda表达式实现了该接口,计算两个数的和并输出结果。请注意,Lambda表达式的参数类型可以根据上下文推断,因此不需要显式声明参数类型。

2.函数式接口 

如第一点的例子的 MathOperation,他的内部只有一个抽象方法,这种只有一个抽象方法的我们就称之为函数式接口

3.Stream流操作

Java 8引入的Stream API 是一种用于处理集合数据的新方式。它提供了一种声明性的、函数式的风格,允许对集合进行复杂的操作,例如过滤、映射、排序等,而无需显式地使用迭代器或循环。

public class Test2 {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "xiaomi", "oppo");

        Stream<String> stream = list.stream();//获取流对象

        List<String> o = stream.filter(s -> s.contains("o"))//中间操作过滤
                .map(String::toUpperCase)//把每个转大写
                .sorted()//排序
                .collect(Collectors.toList());//收集
        
        System.out.println(o);
    }
}

 常见方法有:

中间操作:

        1.filter(element -> condition)根据指定条件过滤元素

        2.map(element -> transform(element))对每个元素执行指定的操作

        3.flatMap(element -> Stream.of(transform(element)))将多个流合并为一个流

        4.distinct() 去除流中重复元素

        5.sorted() 排序

        6.peek(element -> action(element))对每个元素执行操作并返回一个新的流。

终端操作:

        1.forEach(element -> action(element))对流中的每个元素执行指定的操作。

        2.collect()将流收集成指定的集合

        3.reduce((result, element) -> combine(result, element))将流中的元素进行归约操作,如求和、求积等。

        4.count() 返回流中元素数量

        5.anyMatch(element -> condition)检查流中是否至少有一个元素满足指定条件。

        6.allMatch(element -> condition)检查流中是否所有元素满足指定条件。

        7.noneMatch(element -> condition)检查流中是否没有元素满足指定条件。

        8.findFirst() 返回流中第一个元素

 并行流和串行流

并行流是一种并发处理元素的流。它利用多线程同时处理元素,将数据集划分为多个子集,各个子集并行处理。串行流是一种按顺序处理元素的流。它在单线程环境下顺序执行,每个元素依次经过所有的中间操作和终端操作。

他们其实都是stream的流操作,只是在获取流对象时使用了不同的API

  1. 串行流: 使用 stream() 方法创建。

  2. 并行流: 使用 parallelStream() 方法创建。

使用串行流和并行流的选择取决于数据集的大小、处理任务的复杂性以及可用的系统资源。在一些情况下,并行流可以提供更好的性能,但并不是在所有情况下都是最佳选择

4.接口中的默认方法与静态方法

 我创建了一个接口,内容如下:

public interface Test3 {
    default void method1(){
        System.out.println("我是接口的默认方法1");
    }
    
    static void method2(){
        System.out.println("我是接口的静态方法");
    }
    void method3();
    
    abstract  void method4();
}

然后去实现这接口,

可以看到method3()和method()4是必须实现的,而method()1可以也可以重写,method2()这个静态方法则是不可以实现。静态方法只能通过接口名调用。

5.方法引用

方法引用是Java 8中引入的一种语法糖,用于简化Lambda表达式的写法。它允许你直接引用现有方法或构造方法,从而使代码更加简洁和易读。方法引用通常用于函数式接口的实现。在方法引用中,方法的引用被视为Lambda表达式的一种缩写。 

1.静态方法引用: 引用静态方法。

// Lambda表达式写法  
Function<Integer, String> lambdaFunction = x -> String.valueOf(x);

// 方法引用写法
Function<Integer, String> methodReference = String::valueOf;

他的的作用都是创建一个函数式接口的实例,它表示这是一个接受一个Integer类型参数并返回一个String类型结果的函数式接口

2.实例方法引用: 引用特定对象的实例方法。 

// Lambda表达式
BiPredicate<String, String> lambdaPredicate = (x, y) -> x.equals(y);

// 方法引用
BiPredicate<String, String> methodReference = String::equals;

3.对象方法引用: 引用任意对象的实例方法。 

 List<String> list = Arrays.asList("a", "b", "c");

// Lambda表达式
list.forEach(s -> System.out.println(s));

// 方法引用
list.forEach(System.out::println);

4.构造方法引用: 引用构造方法。

// Lambda表达式
Supplier<List<String>> lambdaSupplier = () -> new ArrayList<>();

// 方法引用
Supplier<List<String>> methodReference = ArrayList::new;

6.新的日期和时间 API:

Java 8引入了新的时间和日期API,它是java.time包的一部分。这个API解决了旧的java.util.Datejava.util.Calendar类存在的一些问题,提供了更为灵活、易用和线程安全的时间处理方式。

他有以下特点

  1. 不可变性(Immutability): 所有的类都是不可变的,这意味着一旦创建了一个实例,就无法修改它的值。这有助于线程安全和避免由于修改引起的副作用。

  2. 时区支持: 新的API提供了更好的时区支持,包括对不同时区的转换和计算。

  3. 新的日期和时间类: 包括LocalDate(日期)、LocalTime(时间)、LocalDateTime(日期和时间)、Instant(时间戳)、ZonedDateTime(带时区的日期和时间)等。

  4. 持续时间和周期: 引入了Duration(持续时间)和Period(周期)类,用于处理时间间隔和日期之间的差异。

  5. 格式化和解析: 新的API提供了强大的格式化和解析功能,可以轻松地将日期和时间对象转换为字符串,反之亦然。

  6. 新的时钟和时区API: 提供了Clock类,用于获取当前时间,并支持时区设置。

 // 获取当前日期
        LocalDate currentDate = LocalDate.now();
        System.out.println("Current Date: " + currentDate);

        // 获取当前时间
        LocalTime currentTime = LocalTime.now();
        System.out.println("Current Time: " + currentTime);

        // 获取当前日期和时间
        LocalDateTime currentDateTime = LocalDateTime.now();
        System.out.println("Current Date and Time: " + currentDateTime);

        // 格式化日期
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String formattedDateTime = currentDateTime.format(formatter);
        System.out.println("Formatted Date and Time: " + formattedDateTime);

 7.新的重复注解特性: 允许在同一个元素上多次使用相同的注解。

@RepeatedAnnotation("first")
@RepeatedAnnotation("second")
public void myMethod() {
    // Method implementation
}

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值