前言

java13都已经来了,很多同学还停留在使用java5的东西。如果在日常开发中没有使用上java8的一些新特性或者不会用。这篇文章对你可能有帮助。

lambda表达式

介绍

lambda表达式是java8出的一种新的语法,通过匿名调用的方式使代码更加优雅。

函数式接口

介绍

为了更友好的支持lambda表达式,在java8引入了函数式接口的概念。

  • “函数式接口”是指仅仅只包含一个抽象方法,但是可以有多个非抽象方法(默认方法 default 修饰)的接口。
  • “函数式接口”可以使用@FunctionalInterface注解在接口上进行声明 。所以你看到的接口上有这个注解的都是函数式接口。

在函数式接口中使用lambda表达式

先看下面一段代码

    @Test
public void FunctionalInterface(){ new Thread(new Runnable() {
@Override
public void run() {
print();
}
}); new Thread(
() ->{print();}
); new Thread(() -> print()); new Thread(this::print);
} public void print(){
System.out.println("hello domain");
}
复制代码

上面的Runnable接口就是一个函数式接口, 第一种创建接口实例的方式使传统的匿名内部类。其余三种方式是使用lambda创建的接口实例。第一种没啥好说的,对其余三种的语法说明下。

  1. 第一种的语法格式是普通的完整的lambda语法,格式是: () -> {},小括号里面的就是接口方法的传参,大括号里面的就是方法里面的逻辑。可以对照匿名实现接口的方式来看。
  2. 第二种方式,对比第一种少了大括号, 当大括号里面的代码是一句代码时,可以省略大括号。
  3. 第三种方式叫做lambda方法引用, 小括号,大括号都没了,只剩下方法引用。 为啥可以这么做, 因为大括号里面的调用的方法入参和小括号里面的入参是一致的。在例子中,小括号和大括号里调用的方法都没有参数,如是有参数会是这样的:
    @Test
public void testFunctionalInterface(){
WebService webService = this::print;
webService.sayHi("domain");
} public void print(String str){
System.out.println("hi:"+str);
}
复制代码

上面例子可以看到两个点, 第一个就是上面说的有参数的lambda实践,第二个是lambda表达式返回的确实是一个接口的实现实例。

方法引用

方法引用有三种方式,类名::方法对象::方法类名::new,最后这个语法是引用的构造方法。

Stream

介绍

stream 是java8对集合(不包括map)新增的一个api,配合lambda,更好的对集合进行各种操作。

使用

先创建一个list集合,使用stream来对它操作。

    List<User> users = new ArrayList<>();
users.add(new User("domain",18));
users.add(new User("alex",19));
users.add(new User("lily",20));
users.add(new User("joy",21));
复制代码

过滤(filter)

对集合中的数据进行过滤, 使用filter方法,比如我要拿到集合中年龄大于18的人:

        List<User> users = users.stream()
.filter(new Predicate<User>() {
@Override
public boolean test(User user) {
return user.getAge() > 18;
}
}).collect(Collectors.toList());
复制代码

可以看到,匿名内部实现的那一块,可以用lambda表达式来实现:

        List<User> users = users.stream()
.filter(user -> user.getAge() > 18).collect(Collectors.toList()); 复制代码

说明:user.stream来获得steam对象,filter进行过滤,collect来生成过滤后的对象,因为原对象不会改变。

类型转换(map)

把集合类型和元素改变, 如果我要拿到集合中所有的姓名集合:

        users.stream()
.filter((user) -> user.getAge() > 18)
.map(User::getName)
.forEach(System.out::println);
复制代码

这样就是输出所有的姓名。map之后可以通过刚刚的collect转为一个新的集合对象。例子中没有这样做,是通过forEach将每个元素输出出来。

匹配(match)

寻找集合中的元素,进行匹配。

  • 任一匹配

现在我要知道集合中是否存在domain这个名字的人

       boolean anyMatch = users.stream().anyMatch(user -> "domain".equals(user.getName()));
复制代码
  • 所有匹配

集合中的名字是否都叫domain

boolean allMatch = users.stream().allMatch(user -> "domain".equals(user.getName()));
复制代码
  • 都不匹配

集合中是否没有domain姓名的人

boolean noneMatch = users.stream().noneMatch(user -> "domain".equals(user.getName()));
复制代码

Optional

Optional是Java8提供的为了解决null安全问题的一个API,讲通俗点就是对数据的判空检查。来看下面的例子

  • 我想要获取user对象中的一个值,像下面这样:
user = userService.getUser();
if (user == null) {
throw new Excepiton("用户不存在");
} 复制代码

可以看到为了对数据的判空, 代码变得非常冗长。Optional 提供了一套API 能使得这种判空检查变得优雅些。

  • orElseThrow
User user = Optional.ofNullable(userService.getUser()).orElseThrow(() -> new Exception("用户为空为空"));

复制代码

上面通过调用orElseThrowuser为空时,抛出对应异常。Optional.ofNullable是指定要操作的对象。

  • orElseGet
        String name = Optional.ofNullable(user.getPerson().getName()).orElseGet(() -> "domain");

复制代码

使用orElseGet来设置对象为空时,返回的默认值。

作者:domain
链接:https://juejin.im/post/5db6dbe8e51d452a4366155f

java都13了, 8的新特性你还没不会用吗的更多相关文章

  1. 【Java8新特性】还没搞懂函数式接口?赶快过来看看吧!

    写在前面 Java8中内置了一些在开发中常用的函数式接口,极大的提高了我们的开发效率.那么,问题来了,你知道都有哪些函数式接口吗? 函数式接口总览 这里,我使用表格的形式来简单说明下Java8中提供的 ...

  2. 夯实Java基础系列21:Java8新特性终极指南

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  3. Java 11 这 8 个逆天新特性教你写出更牛逼的代码!

    美国时间2018年 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本. 为什么说是长期版本,看下面的官方发布的支持路线图表. 可以看出 Jav ...

  4. Java 9中的 9个 新特性

    Java 9 中的 9个 新特性 java 7 2011发布,Java 8 2014发布,java9发布于2017年9月21日. 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它 ...

  5. Java 13 即将发布,新特性必须抢先看!

    作者:h4cd 本文转载自开源中国(ID:oschina2013) 由于 Java 现在采取"半年发布一次新版本"的模式,所以 Java 12 的下一个版本 Java 13/JDK ...

  6. jdk1.8新特性,还不知道的朋友还不看看,1.9都快出来了

    一.接口的默认方法 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:代码如下:interface Formula {     ...

  7. Java语言:JAVA8 十大新特性详解(zz)

    关键词: Lambda表达式.函数式接口.方法与构造函数引用.接口的默认方法 原文地址: http://www.jb51.net/article/48304.htm 本教程将Java8的新特新逐一列出 ...

  8. Java 12 正式发布,8大新特性!

    自 2 月 7 日开始,Java/JDK 12 就进入了 RC 阶段.按照发布周期,美国当地时间 3 月 19 日,也就是北京时间 20 号 Java 12 正式发布了! △ JDK 12 GA 发布 ...

  9. Java 15 正式发布, 14 个新特性,刷新你的认知!!

    JDK 15 2020/09/15 如期而至! 这个时间牛逼啊,和苹果发布会同天? OracleJDK 15 发布地址: https://www.oracle.com/java/technologie ...

随机推荐

  1. CSP2019懵逼记

    CSP2019 考场二日游 CJ 旅游团 本来我是准备咕掉的, 但是被强 ♂ 烈要求更博了 Day -INF ~ Day -1 专题巩固和联考 前面半个月疯狂爆炸 后面半个月状态恢复了, 考得还行 联 ...

  2. AtomicInteger原理

    AtomicInteger的原理 java的并发原子包里面提供了很多可以进行原子操作的类,比如: AtomicInteger AtomicBoolean AtomicLong AtomicRefere ...

  3. 5 HashSet

    1.HashSet public class HashSet<E> extends AbstractSet<E> implements Set<E>, Clonea ...

  4. Python 自学笔记(五)

    1.布尔值 1-1.概念 定义计算机中的逻辑判断,只有两种结果,True和False. if,while后面的判断条件就是布尔值,只有条件为True的时候才执行. 1-2.数值比较 1-3.数值运算 ...

  5. 解决python 保存json到文件时 中文显示16进制编码的问题

    python 2.7 import codecs import json with codecs.open('Options.json', 'w', encoding='utf-8') as f: j ...

  6. app微信支付的集成步骤

    1.引用地址 //微信支付 compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+' 2.注册 private IWXAPI api ...

  7. leetcode 79. Word Search 、212. Word Search II

    https://www.cnblogs.com/grandyang/p/4332313.html 在一个矩阵中能不能找到string的一条路径 这个题使用的是dfs.但这个题与number of is ...

  8. Android 显示系统:OpenGL简介和Gralloc代码分析

    一.OpenGL ES与EGL Android的GUI系统是基于OpenGL/EGL来实现的. 由于OpenGL是通用函数库,在不同平台系统上需要被“本土化”——把它与具体平台的窗口系统建立起关联,F ...

  9. C之静态内存和动态内存

    静态内存: * 自动申请,自动释放* 大小固定,内存空间连续* 从栈上分配的内存叫静态内存 动态内存: * 程序员自己申请 * new/malloc* 大小取决于虚拟内存的大小,内存空间不连续* ja ...

  10. 001-多线程-JUC线程池-线程池架构-Executor、ExecutorService、ThreadPoolExecutor、Executors

    一.概述 1.1.线程池架构图 1. Executor 它是"执行者"接口,它是来执行任务的.准确的说,Executor提供了execute()接口来执行已提交的 Runnable ...