首页 > 其他分享 >jdk8新特性

jdk8新特性

时间:2022-09-27 17:55:05浏览次数:42  
标签:stream list System 特性 jdk8 println public out

一、简介

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

标签:stream,list,System,特性,jdk8,println,public,out
From: https://www.cnblogs.com/foredawn/p/16735410.html

相关文章

  • ASEMI快恢复二极管SF3004,SF3004特性,SF3004机械数据
    编辑-ZASEMI快恢复二极管SF3004参数:型号:SF3004最大重复峰值反向电压(VRRM):400V最大RMS电桥输入电压(VRMS):280V最大直流阻断电压(VDC):400V最大平均正向整流输出电流(IF):30A峰......
  • java三大特性
    java三大特性封装、继承、多态封装关键词:private该露的露,该藏的藏。高内聚,低耦合高内聚:类内部的数据操作细节自己完成,不允许外部干预;低耦合:仅暴露少量方法给外部......
  • Java三大特性
    三大特性面向对象三大特性:封装、继承、多态封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问继承:......
  • 物联网三大特性
    一般认为,物联网具有以下的三大特征:1.全面感知:利用RFID、传感器、二维码等随时随地获取物体的信息。2.可靠传递:通过无线网络与互联网的融合,将物体的信息实时准确地传递给用......
  • JavaScript 中的 5 大 ES6 特性
    JavaScript中的5大ES6特性介绍ECMAScript2015(或ES6)是JavaScript的第六版和最新版,它指定了现代Web应用程序的JavaScript实现标准。ES6是编写JavaScript......
  • JDK19新特性使用详解
    前提JDK19于2022-09-20发布GA版本,本文将会详细介绍JDK19新特性的使用。新特性列表新特性列表如下:JPE-405:Record模式(预览功能)JPE-422:JDK移植到Linux/RISC-VJPE-424:外......
  • Java8中stream新特性
    参考总结:https://www.bilibili.com/video/BV1ut411g7E9?p=7&vd_source=c85b4a015a69e82ad4f202bd9b87697f了解Streamjava8中有两大最为重要的改变。第一个是Lambda表达式......
  • nacos启动报错ERROR: Please set the JAVA_HOME variable in your environment, We ne
    昨天在docker上跑了一个nacos,今天就寻思在本地上安装一下nacos,然后安装步骤一切正常,然后在配置自启和以systemd的方式管理docker后进行启动,出现了报错1ERROR:Pleasese......
  • Object.keys的‘诡异’特性,你值得收藏!
    先从‘诡异’的问题入手例1:纯Number类型的属性constobj={1:1,6:6,3:3,2:2}console.log('keys',Object.keys(obj))//['1','2','3','6']......
  • C#教程 - 特性(Attribute)
    更新记录转载请注明出处:2022年9月23日发布。2022年9月10日从笔记迁移到博客。特性(Attribute)说明Anattributeisadeclarativetagthatisusedtoconveyinfo......