JDK8新特性学习

jdk8 时间处理

使用的都是线程安全的

 //获取格式为:今日日期:2020-04-14
        LocalDate today = LocalDate.now();
        System.out.println("今日日期:"+today);
        //获取单独的年月日
        int year = today.getYear();
        int month = today.getMonthValue();
        int day = today.getDayOfMonth();
        System.out.printf("Year : %d Month : %d day : %d \t %n", year, month, day);
        //获取时间格式为:今日日期时间:10:31:49
        LocalDateTime now = LocalDateTime.now();
        System.out.println("今日日期时间:"+now.format(DateTimeFormatter.ofPattern("HH:mm:ss")));
        //时间格式为:今日时间:2020-04-14 10:38:04
        System.out.println("今日时间:"+now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

检查是否为闰年

ChronoUnit为日期枚举类

 LocalDate today = LocalDate.now();
        //检查是否是闰年
        System.out.println(today.isLeapYear());
        System.out.println(today.minus(1, ChronoUnit.YEARS).isLeapYear());

plus()方法

//获取当前日期
        LocalDate today = LocalDate.now();
        //获取一周后的日期
        LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
        System.out.println("下周: " + nextWeek);
        //获取一个月后的当前日期
        LocalDate nextMonth = today.plus(1, ChronoUnit.MONTHS);
        System.out.println("下个月: " + nextMonth);
        //获取一年后的当前日期
        LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);
        System.out.println("一年后: " + nextYear);
        //获取10年后今天的日期
        LocalDate nextDecade = today.plus(1, ChronoUnit.DECADES);
        System.out.println("10年后: " + nextDecade);

时间转换

//时间转换
        String dayAfterTommorrow = "20200516";
        LocalDate formatted = LocalDate.parse(dayAfterTommorrow,
                DateTimeFormatter.BASIC_ISO_DATE);
        System.out.println(formatted);

lambda

1.什么是lambda表达式?
lambda表达式可以理解为一种匿名函数的代替,lambda允许函数作为一个方法的参数(函数作为方法参数的传递),将代码像数据一样传递,目的是简化代码的编号.
2.什么是函数式接口?
lambda表达式需要函数式接口的支持,所谓的函数式接口,是指只有一个抽象方法,另外JDK8也提供了一个注解,帮助我们编译时检查语法是否符合
@FunctionInterface
3.lambda表达式的使用案例:
lambda表达式的基本语法:
函数式接口 变量名 = (参数1,参数2…)->{//方法体};

  //原始写法:
 Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("lambda1");
            }
        };
        new Thread(runnable).start();

//变种1:
        Runnable runnable1 = ()->{
            System.out.println("lambda2");
        };
        new Thread(runnable1).start();
//变种2:
        new Thread(()->{
            System.out.println("lambda3");
        }).start();

/带参数的传值方式:
//传统方式:
        Comparator<String> comparator = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.length()-o2.length();
            }
        };
        TreeSet<String> treeSet = new TreeSet<>(comparator);
        //lambda表达式:
        Comparator<String> comparator1 = (o1,o2)->o1.length()-o2.length();
        TreeSet<String> treeSet1 = new TreeSet<>(comparator1);
        //更简单方式:
        TreeSet<String>treeSet2 = new TreeSet<String>((o1,o2)->o1.length()-o2.length());

4.lambda表达式注意事项
lambda引入了新的操作符:->(箭头操作符),->将表达式分成两部分
左侧:(参数1,参数2…)表示参数列表
右侧:{}内部是方法体
(1)形参列表的数据类型会自动推断;
(2)如果形参列表为空,只需保留()
(3)如果形参只有1个,()可以省略,是需要参数的名称即可
(4)如果执行语句只有1个,且无返回值,{}可以省略;若有返回值,则若想省略,则必须同时省略return,且执行语句也保证只有1句;
(5)lambda不会生成一个单独的内部类文件;
(6)lambda表达式访问了局部变量,则局部变量必须是final的,若是局部变量没有加final关键字,系统会自动添加,此后修改局部变量会报错.

流式编程–StreamAPI

2.1是什么Stream?
Stream是java8中处理数组、集合的抽象概念,它可以指定你希望对集合进行 的操作,
可以执行非常复杂的查找、过滤和映射数据操作,使用Stream API对集合数据进行操作,就类似于
使用sql执行的数据库查询.
一个Stream表面上于一个集合很类似,集合中保存的数据,而流设置的是对数据的操作.
Stream的特点:
1.Stream自己不会存储元素
2.Stream不会改变源对象,相反,他们会返回一个持有结果的新Stream
3.Stream操作是延迟执行的,这意味着他们会等到需要结果时才执行.
Stream遵循"做什么,而不是怎么做"的原则,值需要描述需要做什么,而不是考虑程序是怎么样实现的.
2.2快速体验Stream API的特点:

 //传统方式:
     List<String> data = new ArrayList<String>();
     data.add("a");
     data.add("hello");
     data.add("Stream");
     long count = 0;
        for (String datum : data) {
            if(datum.length()>3){
                count++;
            }
        }
        System.out.println(count);
        //lambda表达式
        //1.链式编程
        //2.函数式接口
        //3.lambda表达式
        //s -> s.length() lambda表达式
        long count1 = data.stream().filter(s -> s.length() > 3).count();
        System.out.println(count1);

2.3使用StreamAPI的步骤
1.创建一个Stream.(创建)
2.在一个或多个步骤中,将初始化Stream转化成另一个Stream的中间操作.(中间操作)
3.使用一个终止操作产生一个结果,该操作会强制他之前的延迟操作立即执行,在这之后,该Stream就不会再被使用了.(终止操作)
2.4创建Stream的方式

 int[] array = new int[]{1,2,3};
        IntStream stream = Arrays.stream(array);
        long result = stream.filter(i->i>1).count();
        System.out.println(result);

2.5 Stream的中间操作
2.5.1筛选和切片(filter,limit,skip(n),distinct)

 List<Employee> employees = new ArrayList<>();
        employees.add(new Employee("zhangsan",20,8000));
        employees.add(new Employee("lisi",30,18000));
        employees.add(new Employee("wangwu",40,28000));
        employees.add(new Employee("wangwu",40,28000));
        //筛选:年龄超过30岁的员工
        Stream<Employee> employeeStream = employees.stream().filter(e -> e.getAge() > 30);
        //一般写法:
        employeeStream.forEach(e->System.out.println(e));
        //
        employeeStream.forEach(System.out::println);
         //获取第一个
        Stream<Employee> limit = employees.stream().limit(1);
        limit.forEach( System.out::println);
        //跳过两个
        Stream<Employee> skip = employees.stream().skip(2);
        skip.forEach(System.out::println);
         //自动调用equals和hashcode
        //使用这个方法必须在对象中重写equals和hashcode
        Stream<Employee> distinct = employees.stream().distinct();
        distinct.forEach(System.out::println);

2.5.2 映射(map)

 /**
         * 映射
         * map接收lambda
         * 将元素转换成其他形式或提取信息,接收一个函数式作为参数,
         * 该函数会被应用到每个元素上,将其映射成一个新的元素.
         */
        Stream<String> stream = employees.stream().map(e->e.getName());
        stream.forEach(System.out::println);

        //小写转为大写
        List<String>list = Arrays.asList("a","b","c","d");
        Stream<String> stream1 = list.stream().map(String::toUpperCase);
        stream1.forEach(System.out::println);

2.5.3 排序 (sorted)

//排序
        System.out.println("-------------按年龄自然排序----------------------");
        Stream<Integer> sorted = employees.stream().map(Employee::getAge).sorted();
        sorted.forEach(System.out::println);
     	System.out.println("-------------定制排序-----------------------------------");
        Stream<Employee> sorted1 = employees.stream().sorted((x, y) -> {
            if (x.getAge() == y.getAge()) {
                return x.getSalary() - y.getSalary();
            } else {
                return x.getAge() - y.getAge();
            }
        });
        sorted1.forEach(System.out::println);

2.6 终止操作
2.6.1遍历操作
forEach
2.6.2查找和匹配`

 /**
         * allMatch--检查是否匹配所有元素
         * anyMatch--检查是否至少匹配一个元素
         * noneMatch--检查是否没有匹配的元素
         * findFirst--返回第一个元素
         * count--返回流中元素的总个数
         * max--返回流中大值
         * min--返回流中的小值
         */

2.7 Stream的串行和并行

//初始化数据
        int max = 1000000;
        List<String> values = new ArrayList<>(max);
        for (int i = 0; i < max; i++) {
            UUID uuid = UUID.randomUUID();
            values.add(uuid.toString());
        }
        //串行计算
        long start = System.currentTimeMillis();
        long count = values.stream().sorted().count();
        System.out.println(count);
        long end = System.currentTimeMillis();
        long millis = end-start;
        System.out.println(millis);
        
        
        //初始化数据
        int max = 1000000;
        List<String> values = new ArrayList<>(max);
        for (int i = 0; i < max; i++) {
            UUID uuid = UUID.randomUUID();
            values.add(uuid.toString());
        }
        //串行计算  命令式的
        long start = System.currentTimeMillis();
        long count = values.parallelStream().sorted().count();
        System.out.println(count);
        long end = System.currentTimeMillis();
        long millis = end-start;
        System.out.println(millis);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值