zoukankan      html  css  js  c++  java
  • Java 8实战之读书笔记二:基础知识

    好记性不如烂笔头,整理一些个人觉得比较重要的东西。

    一、基础知识

    第1章 为什么要关心Java 8

    Java 8提供了一个新的API(称为“流”, Stream),它支持许多处理数据的并行操作,其思路
    和在数据库查询语言中的思路类似——用更高级的方式表达想要的东西,而由“实现”(在这里
    是Streams库)来选择最佳低级执行机制。

    Java 8中加入Streams可以看作把另外两项扩充加入Java 8的直接原因:

        (1).把代码传递给方法的简洁方式(方法引用、 Lambda)

        (2).接口中的默认方法。

    Java 8也用Stream API(java.util.stream)解决了这两个问题:集合处理时的套路和晦涩,以及难以利用多核。

    Collection主要是为了存储和访问数据,而Stream则主要用于描述对数据的计算。

    用行为参数化把代码传递给方法:

        行为参数化:实现了把方法(你的代码)作为参数传递给另一个方法的能力。

    把函数作为一等值。

    第2章 通过行为参数化传递代码

    示例:

    public static boolean isGreenApple(Apple apple) {
        return "green".equals(apple.getColor());
    }
    
    //java.util.function中有这个接口
    public interface Predicate<T> {
        boolean test(T t);
    }
    
    static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> p) {
        List<Apple> result = new ArrayList<>();
        for (Apple apple: inventory){
            if (p.test(apple)) {
                result.add(apple);
            }
        }
        return result;
    }
    
    //使用时:
    filterApples(inventory, Apple::isGreenApple);

    以下是你应从本章中学到的关键概念。
         行为参数化,就是一个方法接受多个不同的行为作为参数,并在内部使用它们, 完成不同行为的能力。
         行为参数化可让代码更好地适应不断变化的要求,减轻未来的工作量。
         传递代码,就是将新行为作为参数传递给方法。但在Java 8之前这实现起来很啰嗦。为接口声明许多只用一次的实体类而造成的啰嗦代码,在Java 8之前可以用匿名类来减少。
         Java API包含很多可以用不同行为进行参数化的方法,包括排序、线程和GUI处理。

    第3章 Lambda 表达式

    161931_zou2_3290751.png

    函数式接口:只定义了一个抽象方法

    @FunctionalInterface:用于表示该接口会设计成一个函数式接口。

    //无装箱操作(推荐)
    IntPredicate evenNumbers = (int i) -> i % 2 == 0;
    evenNumbers.test(1000);
    
    //装箱
    Predicate<Integer> oddNumbers = (Integer i) -> i % 2 == 1;
    oddNumbers.test(1000);

    162603_vQvG_3290751.png

    162636_eTcY_3290751.png

    162709_9Mhi_3290751.png

    162829_jaxC_3290751.png

    复合Lambda表达式的有用方法:

    比较器复合:Comparator.comparing

        .reversed()逆序,.thenComparing比较器链

    谓词复合:negate()非,and,or

    函数复合:.andThen(Function fun),.compose(Function fun)两者顺序相反

    以下是你应从本章中学到的关键概念。
         Lambda表达式可以理解为一种匿名函数:它没有名称,但有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常的列表。
         Lambda表达式让你可以简洁地传递代码。
         函数式接口就是仅仅声明了一个抽象方法的接口。
         只有在接受函数式接口的地方才可以使用Lambda表达式。
         Lambda表达式允许你直接内联,为函数式接口的抽象方法提供实现,并且将整个表达式作为函数式接口的一个实例。
         Java 8自带一些常用的函数式接口,放在java.util.function包里,包括Predicate<T>、 Function<T,R>、 Supplier<T>、 Consumer<T>和BinaryOperator<T>,如表3-2所述。
         为了避免装箱操作,对Predicate<T>和Function<T, R>等通用函数式接口的原始类型
    特化: IntPredicate、 IntToLongFunction等。

         环绕执行模式(即在方法所必需的代码中间,你需要执行点儿什么操作,比如资源分配和清理)可以配合Lambda提高灵活性和可重用性。
         Lambda表达式所需要代表的类型称为目标类型。
         方法引用让你重复使用现有的方法实现并直接传递它们。
         Comparator、 Predicate和Function等函数式接口都有几个可以用来结合Lambda表达式的默认方法。

  • 相关阅读:
    div的显示和隐藏
    asp.net使用My97 Date Picker时设置默认起始时间为n年之前的今天
    2的次幂表示【递归算法训练】
    怎样用JS获取ASP.NET服务器控件的客户端ID
    九度oj 题目1034:寻找大富翁
    CSS + DIV 让页脚始终保持在页面底部
    简单的鼠标可拖动div 兼容IE/FF
    web的各种前端打印方法之CSS控制网页打印样式
    CSS控制print打印样式
    专为控制打印设计的CSS样式
  • 原文地址:https://www.cnblogs.com/itommy/p/10610322.html
Copyright © 2011-2022 走看看