Java1.8新特性学习

Java1.8新特性:
    1. 接口可以定义具体的实现方法,方法前添加default,如:default void test2 () {System.out.println("具体方法");},这个default方法是所有的实现类都不需要去实现的就可以直接调用;
    2. lambda表达式:函数式编程,能够简化代码的开发,如:
        @Test
        public void test1 () {
            List<String> list = Arrays.asList("b", "a", "c");
            Collections.sort(list, (a,b) -> a.compareTo(b));

            for (String  one: list) {
                System.out.println(one);
            }
        }
    3. 自定义函数式接口:仅仅包含一个抽象方法,接口上加@FuctionalInterface定义,接口中的其他方法可使用default和static;
    4. 方法和构造函数的引用可以通过“::”调用,ClassName :: methodName,类名在前,方法名在后,方法名不需要括号,因为你没有实际调用这个方法。方法调用:Integer::valueOf,构造函数调用:User::new;
    5. lambda体可以使用实例变量和局部变量,局部变量的使用需要声明final;
    6. Date api的更新:LocalDate为日期处理类、LocalTime为时间处理类、LocalDateTime为日期时间处理类,TemporalAdjusters类在日期调整时非常有用,比如得到当月的第一天、最后一天,当年的第一天、最后一天,下一周或前一周的某天等。日期格式化使用DateTimeFormatter,DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
    7. 流:Stream就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。而和迭代器又不同的是,Stream可以并行化操作,迭代器只能命令式地、串行化操作。流可以看成遍历数据集的高级迭代器,可以并行处理,并行去遍历时,数据会被分成多个段,每一个在不同的线程中处理,之后结果一起输出;
    8. 流的操作类型:
        1)Intermediate(中介):一个流可以后面跟随零个或多个intermediate操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历;
        2)Terminal(最终的):一个流只能有一个terminal操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。Terminal 操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个side effect;
    9. 在对于一个Stream进行多次转换操作(Intermediate操作),每次都对 Stream 的每个元素进行转换,而且是执行多次,这样时间复杂度就是 N(转换次数)个for循环里把所有操作都做掉的总和吗?其实不是这样的,转换操作都是lazy的,多个转换操作只会在Terminal操作的时候融合起来,一次循环完成。我们可以这样简单的理解,Stream里有个操作函数的集合,每次转换操作就是把转换函数放入这个集合中,在Terminal操作的时候循环 Stream对应的集合,然后对每个元素执行所有的函数;
    10. stream具体使用:
        1)Function.identity()返回一个输出跟输入一样的Lambda表达式对象,等价于形如t -> t形式的Lambda表达式;
        2)list过滤再转成新的list:list.stream().limit(7).filter(x -> x % 2 == 0).limit(2).collect(Collectors.toList());
        3)流的归约操作,根据自己分组统计数量,归约为map:list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
        4)对数据重整(map有返回值):list.stream().map(Student::getName).collect(Collectors.toList());
        5)对数据处理(peek无返回值):Stream.of(s.split("#")).peek(e -> System.out.println(e)).collect(Collectors.toList());


    

发布了38 篇原创文章 · 获赞 7 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43285577/article/details/88848033