为什么要关心Java8

Stream API

java8提供了一个新的API,简称Stream。它支持多核处理器并行操作,很多思路来源于数据库的操作,可以减少很多数据库SQL操作。
在java8可以有一个更高层次的抽象,思路变成把这样的流变成那样的流,而不是一次只处理一个项目;还有一个好处,Java8可以透明的把输入的不相干部门拿到几个CPU内核上去分别执行Stream流水线操作,这些并行操作都是免费的。

  • 外部迭代
   List<Apple> inventory = Arrays.asList(new Apple("green", 4), new Apple("red", 55));
        //过滤出青苹果
        List<Apple> colorList = new ArrayList<>();
        for (Apple apple : inventory) {
            if (apple.getColor().equals("green")) {
                colorList.add(apple);
            }
        }

所谓的外部迭代我的理解就是我们需要关心迭代的细节。

  • 内部迭代
List<Apple> inventory = Arrays.asList(new Apple("green", 4), new Apple("red", 55));
        inventory.stream().filter(apple -> apple.getColor().equals("green")).collect(Collectors.toList());

在内部迭代里面我们只是告诉它一个迭代规则,具体怎么迭代我们并不关心;而且这代码更易于阅读,少了很多干扰项。

向方法传递代码的技巧

Java8中将代码传递给方法的功能还让我们能够使用一套新技巧,通常称为函数式编程。
Java8增加了把方法作为参数传递给另一个方法,这一概念叫做行为参数化。

  • 方法引用
    和对象创建类型使用 Object::method 表示方法引用。

例如你需要筛选一个目录下面的所有隐藏文件。
java8之前:

  File[] files = new File(".").listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isHidden();
            }
        });

对于这个匿名类FileFilter是不是觉得没啥用,而且还不易阅读。我们想要做的就是判断这个文件是不是隐藏文件。
Java8

  File[] files = new File(".").listFiles(File::isHidden);
  或者
  File[] files = new File(".").listFiles(file->file.isHidden());

这也就是我们所说的传递方法,传递行为,不再仅仅是传递值了。

  • Lambda
    例如:
  static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> test) {
        List<Apple> result = inventory.stream().filter(apple -> test.test(apple)).collect(Collectors.toList());
        return result;
    }

Lambda 的目的使代码更清新,更干净。

接口中的默认方法

默认方法的作用是:为了支持库设计,让接口更容易改造。
例如:

List<Apple> inventory = Arrays.asList(new Apple("green", 4), new Apple("red", 55));
        inventory.stream().filter(apple -> apple.getColor().equals("green")).collect(Collectors.toList());

在Java8 之前list里面并没有stream方法,它的祖先类Collection里面也没有stream方法,那它是怎么添加stream的呢?如果加在Collection里面是不是意味着它的所有子类都需要去重写stream方法,这无疑是不可能的。
Java8 的做法是:接口如今可以包含实现类没有提过实现的方法签名,缺失的方法主体随接口提供。在Java8的接口声明中使用新的default关键字来表示这一点。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.Java8让编程起来更容易 提供了更多的编程工具和概念,能以更快,更简洁,更易于维护的方式解决问题,比如: J...
    小Noodles阅读 3,056评论 0 0
  • Java8 in action 没有共享的可变数据,将方法和函数即代码传递给其他方法的能力就是我们平常所说的函数式...
    铁牛很铁阅读 5,010评论 1 2
  • Streams 原文链接: Streams 原文作者: shekhargulati 译者: leege100 状态...
    忽来阅读 10,842评论 3 32
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,323评论 19 139
  • 电影鸡汤里好多有类似的句子,那些当年让你流泪的事情,终究会让你笑着讲出来。 我不敢苟同。 学前班时,一般是妈妈负责...
    S的随便用账号阅读 3,770评论 0 51