java 8 新特性,接口默认方法、lambda表达式、Optional、stream

2023-11-03

java 8 新特性

当面试官让我说几个java 8 的新特性,我巴拉巴拉把知道的都说了,然而,面试官接着问,stream里面如果按照分类过滤怎么做呢?map()是什么?
”嘀,扫码成功,哎呀,地铁里面的空调真不错啊,真不错“。

果然,只做到了解是不行的啊,其实这些都不是难点,关键是不使用的话很难记住这些东西,像我们这样的小公司大多数都是靠数据库操作逻辑的人,显然这些新东西没有用武之地,虽然我也在尽量使用Optional,foreach这些,但还是太简单了,大公司大多都注重代码简洁,人家一行代码就搞定的东西,你搞个几十行,这就是差距啊。

1.接口默认方法

通过default 关键字可以为接口中的方法提供默认实现:

public interface MyJava8Service {
    default int getNewNum(int num) {
        return 2 * num;
    }
}

测试

public static void main(String[] args) {
    MyJava8Service java8Service = new MyJava8Service() {};
    System.out.println("新特性,接口默认方法:"+java8Service.getNewNum(4));
}

输出结果:
新特性,接口默认方法:8

2.lambda表达式

它允许把函数当做参数来使用,是面向函数式编程的思想,一定程度上可以使代码看起来更加简洁

 public interface TestForLambda{
   void sendMessage();
}

public interface TestForLambda2{
    String getMessage(String msg);
}

public static void main(String[] args){
    TestForLambda testForLambda = ()-> {
        System.out.println("简单实现了接口方法");
        System.out.println("do something");
    };
    testForLambda.sendMessage();

    TestForLambda2 testForLambda2 = (a)->"hello "+a;
    System.out.println(testForLambda2.getMessage("javajov"));
}

测试结果:

简单实现了接口方法
do something
hello java jov

3.Optional

用来处理空值的类,如果你使用过springboot的jpa 那么你肯定对Optional不陌生,通过ID从数据库查询记录的时候返回的就是Optional。如果你项目中使用过kotlin,我相信各位对它在空值变量的限制上一定映像深刻。可见现在对null的处理开始重视起来了。

测试代码

public static void main(String[] args) {
    System.out.println("=======测试有值的情况begin========");
    Optional<String> ret = Optional.of("javajov");
    ret.ifPresent(data -> System.out.println("有值的时候做点事情:" + data));
    System.out.println("获取值1:" + ret.orElse("如果为空则返回else提供的内容"));
    System.out.println("获取值2:" + ret.get());
    System.out.println("=======测试有值的情况end========");

    System.out.println("=======测试NULL的情况begin========");
    String bean = null;
    Optional<String> ret2 = Optional.ofNullable(bean);
    ret2.ifPresent(data -> System.out.println("有值的时候做点事情:" + data));

    System.out.println("获取值1:" + ret2.orElse("如果为空则返回else提供的内容"));
    System.out.println("获取值2:" + ret2.get());
    System.out.println("=======测试NULL的情况end========");
}

输出
=======测试有值的情况begin========
有值的时候做点事情:javajov
获取值1:javajov
获取值2:javajov
=======测试有值的情况end========
=======测试NULL的情况begin========
获取值1:如果为空则返回else提供的内容
Exception in thread "main" java.util.NoSuchElementException: No value present

4.stream

它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("cc");
    list.add("bb");
    list.add("dd");
    list.add("aa");
    list.add("111");
    list.add("222");
    list.add("333");
    //filter过滤,假如list里面存放的是实体类,使用filter可以按照你想要的方式进行过滤
    List<String> newlist = list.stream().filter(bean -> bean.length() == 3).collect(Collectors.toList());
    System.out.println("filter过滤之后:");
    newlist.forEach(bean -> System.out.print(bean + ","));
    System.out.println();
    System.out.println("list 原来的内容并不会变化如下:");
    list.forEach(bean -> System.out.print(bean + ","));
    System.out.println();

    //使用sorted进行排序
    List<String> sortedList = list.stream().sorted((a, b) -> a.compareTo(b)).collect(Collectors.toList());
    System.out.println("sorted排序之后:");
    sortedList.forEach(bean -> System.out.print(bean + ","));
    System.out.println();
    System.out.println("list 原来的内容并不会变化如下:");
    list.forEach(bean -> System.out.print(bean + ","));
    System.out.println();

    //使用map进行转换
    List<String> mapList = list.stream().map(bean -> bean.toUpperCase()+"hello").collect(Collectors.toList());
    System.out.println("map转换之后:");
    mapList.forEach(bean -> System.out.print(bean + ","));
    System.out.println();
    System.out.println("list 原来的内容并不会变化如下:");
    list.forEach(bean -> System.out.print(bean + ","));
    System.out.println();
}

输出:

filter过滤之后:
111,222,333,
list 原来的内容并不会变化如下:
cc,bb,dd,aa,111,222,333,
sorted排序之后:
111,222,333,aa,bb,cc,dd,
list 原来的内容并不会变化如下:
cc,bb,dd,aa,111,222,333,
map转换之后:
CChello,BBhello,DDhello,AAhello,111hello,222hello,333hello,
list 原来的内容并不会变化如下:
cc,bb,dd,aa,111,222,333,

其他还有很多方法,大家可以去看一下Stream这个类,一定要把各个方法都尝试一遍,我这里面只是把面试中常问到的几个列了一下,但是并不代表其他不会被问到,作为一个以高级工程师、架构师为目标的面试者,这些东西都掌握不是应该的吗。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 8 新特性,接口默认方法、lambda表达式、Optional、stream 的相关文章

随机推荐

  • 几种页面重定向代码

    方法一 对于HTML语言 以下是代码片段 Loading 对于HTML语言可以用如上方法 以上含义为 则会在2秒之后重定向到 http www 你的域名 com 如果 http www 你的域名 com为本身 则每2秒自动刷新1次 如果 c
  • ECharts大屏可视化

    文章目录 ECharts大屏可视化 一 项目概述 1 1 项目介绍 1 2 项目架构 1 3 使用环境 二 数据获取 1 获取腾讯数据 1 1数据爬取 1 2数据存储 创建数据库 连接数据库 插入和更新数据 2 爬取百度热搜数据 2 1数据
  • 使用tps5430制作正负DC-DC降压电源,tps7a47和tps7a33制作正负LDO线性电源

    今天 小刚我制作了一款DC DC和LDO线性电源 其输入范围为10V 35V 配置4个电源输出端分别为 开关电源tps5430 正负12V 正负5V LDO线性电源tps7a47和tps7a33 正负5V 正负3 3V 第一部分TPS543
  • 飞桨AI套件首秀:新版PaddleX精选模型产业落地实战

    近日 飞桨AI套件PaddleX 精选产业实用模型的一站式开发套件正式上线AI Studio星河社区 也发布了 Windows 本地端 助力人工智能技术在各领域的实际应用 PaddleX具有优质的算法库 便捷的开发方式 高效的模型部署 丰富
  • pass软件计算样本量_R语言元分析专题第十五章:计算效应量的大小

    尽管通过meta软件包调用metabin或metacont函数 可以计算出每个研究中的个体效应大小 individual effect sizes 但一些论文却没有以正确的格式报告这些效应量数据 特别是 一些较老的文章可能只报告了t检验 A
  • c++学习之c++对c的扩展1

    目录 1 面向过程与面向对象的编程 2 面向对象编程的三大特点 3 c 对c的扩展 1 作用域运算符 2 命名空间 1 c 命名空间 namespace 2 命名空间的使用 1 在不同命名空间内可以创建相同的名称 2 命名空间只能在全局范围
  • 【QT学习】结构体在qt的传递

    1 自定义结构体使用信号槽在qwidget中传递 typedef struct tagPoint tPos tIn QHash
  • 通达信缠论完整指标_【画线参数调整、拔地而起指标介绍、走势完美实战案例】疯狂的缠论通达信版自动画线选股指标更新:很小但很有用的更新...

    导读 文章包含4部分 通达信版画线选股指标的画线参数都可以手动调整了 通达信版画线选股指标子指标介绍 拔地而起 走势完美策略实战案例 走势完美策略实战要点 理论 1 通达信版自动画线选股指标更新 画线参数都可以手动调整 疯狂的缠论通达信版自
  • Java 实现图片转base64

    一 自己实现byte数组拷贝 public class Base64Util base64图片 存储的byte数组 private byte baseByte new byte 0 public static void main Strin
  • Skill: UltraEdit: ue64ctmn.dll 删除不掉

    卸载UltraEdit时ue64ctmn dll删除不掉 原因 自动生成鼠标右键菜单项 该文件被鼠标右键menu占用 解决 在运行中输入 regedit 展开 HKEY CLASSES ROOT shellex ContextMenuHan
  • 基于uniapp实现掘金的微信小程序模版小项目

    代码地址 1 前言 涉及的框架及技术 uniapp vant animate vuex iconfont websocket 2 启动流程 直接用Hbuilder打开 然后点击运行 gt 运行到小程序模拟器 gt 微信开发者工具 启动之后如
  • 用AI写代码 -- Github Copilot测试

    截图为copilot官网 要使用copilot 首先要安装vscode 下载copilot插件 下载完了以后 并不能马上使用 还需要申请内测账号 前几天 我终于收到内测账号通过的邮件 趁着今天在家 连忙打开vscode测试一下 爬图片 我们
  • STL——String类(2)成员函数详解

    目录 前言 一 String的成员函数 1 基本成员函数 代码实验 实验结果 类对象每次扩容后的capacity数据展示 1 2 resize 调整字符串大小 1 3reserve 请求更改该对象的容量capacity值 代码实验 前言 S
  • 新建的maven项目没有maven依赖

    把该项目转成动态web项目 出现web图标后再右键项目 点击属性 添加maven依赖 删除项目 不删源码 重新引入后可出现maven依赖 有时未成功 可重新添加maven依赖 这时在pom xml文件中添加的依赖也会进入到maven依赖中
  • 微信小程序怎么设置全局背景颜色?

    其实啊 这个可简单了 有手就行 首先 打开微信小程序开发工具 其次 找到全局配置app json文件 修改 navigationBarBackgroundColor 222 这是修改的导航栏的颜色 接着 在app wxss文件中 配值pag
  • JAVA微服务场景下分布式日志收集排查问题实战

    问题产生的根由 不同服务的日志存在哪里 我们怎么去排查线上问题 问题场景 我们部署的java服务可能有几十个 不同的项目里面他是看不到别的服务的日志 只有服务的返回msg消息 相比传统的单体服务来说 排查问题和解决问题的原因相对比较复杂和麻
  • 《Kafka权威指南》——初识 Kafka

    发布与订阅消息系统 在正式讨论Apache Kafka 以下简称Kafka 之前 先来了解发布与订阅消息系统的概念 并认识这个系统的重要性 数据 消息 的发送者 发布者 不会直接把消息发送给接收 者 这是发布与订阅消息系统的一个特点 发布者
  • 性能测试很难吗?一文带你学会性能测试核心流程和概念

    在很多人的概念中 性能测试就是使用Loadrunner Jmeter等工具进行压测 然后得到测试结果即可 但仔细想想 对谁进行测试 测试目的是什么 监测指标有哪些 得到的结果如何分析 怎样的结果算通过 等等 所以使用工具压测只是性能测试最基
  • 泰迪杯C题第二问

    面包多 https mianbaoduo com o bread Ypmbl5Zq
  • java 8 新特性,接口默认方法、lambda表达式、Optional、stream

    java 8 新特性 当面试官让我说几个java 8 的新特性 我巴拉巴拉把知道的都说了 然而 面试官接着问 stream里面如果按照分类过滤怎么做呢 map 是什么 嘀 扫码成功 哎呀 地铁里面的空调真不错啊 真不错 果然 只做到了解是不