jdk8新特性

一、简介

Java8(又称为jdk1.8)是Java语音开发的一个主要版本。

Java 8 是 oracle 公司于 2014 年 3 月发布,可以 看成是自 Java 5 以来最具革命性的版本 。 Java 8 为 Java 语言、编译器、类库、开发工具与 JVM 带来了大量新特性。

  1. 函数式接口
  2. Lambda表达式
  3. 方法引用/构造器引用
  4. Stream API (其中包括并行流和串行流)
  5. 接口的增强  (静态方法和默认方法)
  6. Optional类
  7. 新的时间和DateTime API
  8. 其他新特性

二、开始介绍

1.Lambda表达式

Lambda好处:简化匿名内部类的调用,使代码变得更加精简

Lambad演变过程

复制代码
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    //名字
    private String name;
    //性别
    private String sex;
    //薪水
    private int salary;
    //年龄
    private int age;
    //星座
    private String star;
}
View Code
复制代码

1.1 普通筛选(将集合进行遍历,并依次判断)

复制代码
@Test
public void test1(){
    //首先创建一个
    List<Student> list = Arrays.asList(
            new Student("九天","男",5000,18,"天秤座"),
            new Student("十夜","男",4000,16,"双鱼座")
    );
 
    List<Student> result = new ArrayList<>();
    for (Student student:list){
        if ("天秤座".equals(student.getStar())){
            result.add(student);
        }
    }
    System.out.println(result);
}
普通筛选
复制代码

1.2 匿名内部类筛选

public interface FilterProcess<T> {
    boolean process(T t);
}
公共接口
复制代码
public List<Student> filterStudent(List<Student> students, FilterProcess<Student> mp){
    List<Student> list = new ArrayList<>();
 
    for (Student student : students) {
        if(mp.process(student)){
            list.add(student);
        }
    }
    return list;
}
公共函数
复制代码
复制代码
@Test
public void test2(){
    List<Student> students = Arrays.asList(
            new Student("九天","男",5000,18,"天秤座"),
            new Student("十夜","男",4000,16,"双鱼座")
    );
 
    List<Student> list = filterStudent(students, new FilterProcess<Student>() {
        @Override
        public boolean process(Student student) {
            return student.getStar().equals("天秤座");
        }
    });
    for (Student student : list) {
        System.out.println(student);
    }
}
匿名内部类
复制代码
复制代码
@Test
public void test1() {
    List<Student> list = Arrays.asList(
            new Student("九天","男",5000,18,"天秤座"),
            new Student("十夜","男",4000,16,"双鱼座")
    );
 
    list.stream().filter((e) -> e.getStar().equals("天秤座"))
            .forEach(System.out::println);
}
Lambad运行
复制代码

  2.Stream API

  Stream API是JDK1.8中处理集合的关键抽象理念。Stream使用一种类似用SQL语音从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象。

  主要是将要处理的元素集合看做流,使其在管道中传输,并且可以在传输的节点上进行处理,如:筛选、排序等。

  2.1 map 的key转换为list

复制代码
@Test
public void test3() {
    List<String> names = list.stream().map(Student::getName).collect(Collectors.toList());
    names.stream().forEach(System.out::println);
}
转换为list
复制代码

  2.2 mapToInt 转换数值流

复制代码
@Test
public void test4() {
    IntStream intStream = list.stream().mapToInt(Student::getAge);
    Stream<Integer> integerStream = intStream.boxed();
    Optional<Integer> max   = integerStream.max(Integer::compareTo);
    System.out.println(max.get());
}
数值流
复制代码

  2.3 flatMap合并为一个流

复制代码
@Test
public void test5() {
    List<String> list2 = new ArrayList<>();
    list2.add("aaa bbb ccc");
    list2.add("ddd eee fff");
    list2.add("ggg hhh iii");
    list2 = list2.stream().map(s -> s.split(" ")).flatMap(Arrays::stream).collect(Collectors.toList());
    System.out.println(list2);
}
View Code
复制代码

  2.4 去重

复制代码
@Test
public void test6() {
    List<String> list2 = new ArrayList<>();
    list2.add("aaa bbb ccc");
    list2.add("ddd eee fff");
    list2.add("ggg hhh iii");
    list2.add("ggg hhh iii");
 
    list2.stream().distinct().forEach(System.out::println);
}
View Code
复制代码

  2.5 sorted排序

复制代码
@Test
public void test7() {
    //asc排序
    list.stream().sorted(Comparator.comparingInt(Student::getAge)).forEach(System.out::println);
    System.out.println("------------------------------------------------------------------");
    //desc排序
    list.stream().sorted(Comparator.comparingInt(Student::getAge).reversed()).forEach(System.out::println);
}
View Code
复制代码

  2.6 skip跳过(指跳过前几个,例skip(2),则跳过前两个)

复制代码
@Test
public void test8() {
    list.stream().skip(1).forEach(System.out::println);
}
View Code
复制代码

  2.7 limit截取

复制代码
@Test
public void test10() {
    list.stream().limit(1).forEach(System.out::println);
}
View Code
复制代码

  2.8 anyMatch(与其中任意一个条件符合)

复制代码
@Test
public void test11() {
    boolean isHave = list.stream().anyMatch(student -> student.getAge() == 16);
    System.out.println(isHave);
}
View Code
复制代码

  2.9 allMatch(全部符合)

复制代码
@Test
public void test12() {
    boolean isHave = list.stream().allMatch(student -> student.getAge() == 16);
    System.out.println(isHave);
}
View Code
复制代码

  2.10 noneMatch(是否满足没有符合的)

复制代码
@Test
public void test13() {
    boolean isHave = list.stream().noneMatch(student -> student.getAge() == 16);
    System.out.println(isHave);
}
View Code
复制代码

  2.11 findAny(找到其中一个元素,使用stream时找到的是第一个元素,使用paramStream并行时找到的是其中一个元素)

复制代码
@Test
public void test14() {
    Optional<Student> student = list.stream().findAny();
    System.out.println(student.get());
}
View Code
复制代码

  2.12 count 计数

复制代码
@Test
public void test17() {
    long count = list.stream().count();
    System.out.println(count);
}
View Code
复制代码

  2.13 of(生成一个字符串流)

复制代码
@Test
public void test18() {
    Stream<String> stringStream = Stream.of("i","love","you");
}
View Code
复制代码

  2.14 empty(生成一个空流)

复制代码
@Test
public void test19() {
    Stream<String> stringStream = Stream.empty();
}
View Code
复制代码

  2.15 collect:averagingLong(求平均值)

复制代码
@Test
public void test1(){
    // 求年龄平均值
   Double average = list.stream().collect(Collectors.averagingLong(Student::getAge));
}
View Code
复制代码

  2.16 reduce求和

复制代码
例:
User u = list.stream().reduce((u1, u2) -> new User("sum", u1.getAge() + u2.getAge())).get();
        System.out.println(u);
        System.out.println("age sum->" + u.getAge());
}
View Code
复制代码

  2.17 for循环

复制代码
   // stream For循环
    @Test
    public void streamFor() {
        List<User> list = userList();
        list.stream().forEach(u-> System.out.println(u));
    }
View Code
复制代码

  3.Date

  优势:

1)不变性:新的日期/时间API中,所有类都是不可变的,对多线程环境有好处。

2)关注点分离:新的API将可读的日期和机器时间明确分离。

3)清晰:在所有的类中,方法都被明确定义用以完成相同的行为。

4)实用操作:所有新的日期/时间API类都实现了一系列方法用来完成通用的任务。

5)可扩展性:新的日期/时间API是工作在ISO-8601日历系统上的。

  3.1 获取当前时间

复制代码
Instant instant = Instant.now(); //获取当前时间戳
 
LocalDate localDate = LocalDate.now();  //获取当前日期
 
LocalTime localTime = LocalTime.now();  //获取当前时刻
 
LocalDateTime localDateTime = LocalDateTime.now();  //获取当前具体时间
 
ZonedDateTime zonedDateTime = ZonedDateTime.now();   //获取带有时区的时间
View Code
复制代码

  3.2 时间戳转LocalDateTime

复制代码
long timestamp = System.currentTimeMillis();
 
Instant instant = Instant.ofEpochMilli(timestamp);
 
LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
View Code
复制代码

  3.3 LocalDateTime转时间戳

复制代码
LocalDateTime dateTime = LocalDateTime.now();
 
dateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
 
dateTime.toInstant(ZoneOffset.of("+08:00")).toEpochMilli();
 
dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
View Code
复制代码

 

  参考自:https://blog.csdn.net/qq_25391785/article/details/123377399

posted @   歳月  阅读(89)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
点击右上角即可分享
微信分享提示