Java8新特性学习

原创
2019/06/28 10:56
阅读数 412

1 简述

公司自年初终于开始使用java8作为项目的标准jdk,在开发过程中,逐渐认识到java8的很多新特性,确实很方便.其中内容的核心,在于函数式编程,即将函数本身作为对象参数去处理.其中涉及到三个关键新特性:

  1. lambda表达式(及函数式接口)
  2. stream
  3. 方法引用
    这三个新特性的使用是相辅相成的,特别是前两者,作为本文的重点来说.

参考链接:

  1. Java8新特性,你应该了解这些

2 新特性的适用场景

lambda表达式,就我现在的使用经验,其实就是与JavaScript中的箭头函数是一样的.只不过js一直都支持将函数看做是对象参数,所以箭头函数对js更像一个语法糖.但lambda表达式对于java的改变就重要很多了,直接允许了函数式编程,这是此前版本所无法实现的.
lambda表达式最常见的使用场景是和stream一同使用.stream的详细介绍建议阅读参考链接了解.虽然适用于很多种类型,但在开发项目时,用到最多的,还是集合.

//演示代码
List<String> output = wordList.stream().
map(str->str.toUpperCase.
collect(Collectors.toList());

以下是我对比java8和js集合中的方法,列举的一个表格(可以看到,js此前有的方便方法,java8基本都能做到):

streamType java8 js 作用
intermediate map map 将stream中的每一个元素,映射为另外一个元素
intermediate flatMap flat,flatMap 将stream中的层次结构扁平化
intermediate filter filter 对每一个元素进行测试,通过测试的元素留下来
terminal forEach forEach 对每一个元素执行操作
intermediate peek 对每一个元素执行操作
terminal findFirst find 查找符合条件的第一个元素
terminal reduce reduce 依序将元素组合起来得到一个新的值
intermediate limit slice 返回前n个元素
intermediate skip slice 跳过前n个元素(返回剩下的元素)
intermediate sorted sort 对元素进行排序
terminal min 最小值
terminal max 最大值
intermediate distinct 去除重复值
terminal allMatch every 全部元素符合
terminal anyMatch some 任一元素符合
terminal noneMatch 没有元素符合

以上仅为常用方法.streamType表示的是流操作的类型,intermediate类型操作后仍可继续按照流操作,terminal类型操作则会终止流操作.

参考链接:

  1. Java 8 中的 Streams API 详解
  2. js Array的原型方法

3 方法引用

方法引用本身是语法糖,它将箭头函数表示的方法引用,改用"::"替代.
注意,这里说的是方法引用,而不是方法本身,即将

stream.map(str->str.toUpperCase)

stream.map(String::toUpperCase)

来替换.

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部