我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java8实用技能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java8实用技能

大概一年多之前,我对java8的理解还仅限一些只言片语的文章之上,后来出于对函数式编程的兴趣,买了本参考书看了一遍,然后放在了书架上,后来,当我接手大客户应用的开发工作之后,java8的一些工具,对我的效率有了不小的提升,因此想记录一下java’8的一些常用场景,我希望这会成为一个小字典,能让我免于频繁翻书,但是总能找到自己想找的知识。

用于举例的model:

@Datapublic class Apple {    private Long appleId;    private String appleName;    private Float appleWeight;    private Integer appleClassic;}

一、Java 8 Lambda 表达式

这无疑是最常用的功能之一,其实lambda表达式的作用,应该就是简洁明了,实际上是用最短的字符,通过类型推导,语法糖等方式去对编译器描述清楚这段代码的功能,这和泛型有点相似,对于编程人员来说,一定程度上也提高了编程效率和代码可读性。

如常用的lambda表达式:
process(()->System.out.println(“this is so cool!”))

例如对苹果重量排序:

   List<Apple> apples = Lists.newArrayList();        for (int i = 1; i < 10; i++) {            Apple apple = new Apple();            apples.add(apple);        }        apples.sort(Comparator.comparing(Apple::getAppleWeight));反序:        apples.sort(Comparator.comparing(Apple::getAppleWeight).reversed());重量相同时:比较等级:  apples.sort(Comparator                .comparing(Apple::getAppleWeight)                .reversed()谓词复合查询:  Predicate<Apple> a = apple -> apple.getAppleWeight() > 10;        weight10.or(apple -> apple.getAppleClassic() > 2)                .and(apple -> StringUtils.equalsIgnoreCase(apple.getAppleName(), "优质苹果"));可以看做(a||b)&&c函数复合:        Function<Apple, Float> f = a -> a.getAppleWeight() + 1;        Function<Float, Float> g = a -> a * 2;        Function<Apple, Float> h = f.andThen(g);    数学写作 h=g(f(x))  Function<Apple, Float> g = a -> a.getAppleWeight() + 1;        Function<Float, Float> f = a -> a * 2;        Function<Apple, Float> h = f.compose(g); 数学写作 h=f(g(x))

小结:java8实际上想传递函数,函数是什么?是一个映射,可以看做x->y,输入x然后映射到值y的过程,
java无法摆脱一切皆是对象的思想,因此函数式依附在对象上传递的,因此也有了下面的说法,方法引用,以及函数式接口,让函数随着对象传递,为了函数式编程,甚至专门写一个接口—-对象来传递函数。然而,函数才是主角。

二、Java 8 方法引用

方法引用十分简单,其实也是将方法作为参数传递。使用::域作用符,将一段方法传递。
举例:Apple::getAppleId
String::subString
System.out::println

三、Java 8 函数式接口 函数式编程

利用java进行函数式编程主要就是利用函数式接口,但是函数式接口在java8之前就有一些了,就例如多线程的runnable,但是8以前是没有lambda表达式的,所以只能使用匿名内部类,在用过lambda表达式的人看来,那是相当臃肿的,8更新了lambda表达式,这就使函数式编程更上一层楼.

java8的函数式接口为我们传递函数提供了工具,我们可以自己定义函数式接口,然后让其他人,或者是java API调用。
关于函数接口,需要记住的就是两件事:
函数接口是行为的抽象;
函数接口是数据转换器。

四、Java 8 Stream

在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现。其本质是,将一些原本开发者需要做的处理如迭代等,放在了java库里,让我们只关心自己的业务逻辑,比如我们希望对一个包含整数的集合中筛选出所有的偶数,并将其封装成为一个新的List返回,那么在java8之前,我们需要通过如下代码实现:

过去:List<Integer> evens = new ArrayList<>();for (final Integer num : nums) {    if (num % 2 == 0) {        evens.add(num);    }}stream实现:List<Integer> evens = nums.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());我们需要取出10个等级高于3的苹果,跳过其中两个,按重量排序,去重,然后取出苹果的Name,然后取出名字的每个字符: List<String> appleName = apples.parallelStream()                .filter(a -> a.getAppleClassic() < 2)                .sorted(Comparator.comparing(Apple::getAppleWeight))                .map(Apple::getAppleName)                .map(s -> s.split(""))                .limit(10)                .skip(2)                .distinct()                .flatMap(Arrays::stream)                .collect(Collectors.toList());   构造AppleId ApppleName Map:        Map<Long, String> appleIdMap = apples.stream()                .collect(Collectors.toMap(Apple::getAppleId, Apple::getAppleName, (s, s2) -> s.length() > s2.length() ? s : s2)); 谓词查找:       if (appleName.stream().anyMatch(a -> StringUtils.equalsIgnoreCase(a, "一级苹果")));        if (appleName.stream().allMatch(a -> StringUtils.equalsIgnoreCase(a, "一级苹果")));        if (appleName.stream().noneMatch(a -> StringUtils.equalsIgnoreCase(a, "一级苹果")));短路查找:        appleName.stream()                .filter(a -> StringUtils.equalsIgnoreCase(a, "一级苹果"))                .findAny()                .ifPresent(System.out::println);findfirst在并行时限制多一些,如果不在意返回的是哪个元素,使用findAny。求和:             apples.stream()    .map(Apple::getAppleWeight)    .reduce(0F, (a, b) -> a + b);计数:        apples.stream().count();

使用stream的好处:
1.更简洁,更易读
2.可复合,更灵活
3.可并行

五、Java 8 Optional 类

Optional着重为解决java的NPE问题是Java8提供的为了解决null安全问题的一个API。善用Optional可以使我们代码中很多繁琐、丑陋的设计变得十分优雅。

使用Optional,我们就可以把下面这样的代码进行改写:public static String getName(User u) {    if (u == null)        return "Unknown";    return u.name;}不过,千万不要改写成这副样子。public static String getName(User u) {    Optional<User> user = Optional.ofNullable(u);    if (!user.isPresent())        return "Unknown";    return user.get().name;}这样才是正确使用Optional的姿势。那么按照这种思路,我们可以安心的进行链式调用,而不是一层层判断了。public static String getName(User u) {    return Optional.ofNullable(u)                    .map(user->user.name)                    .orElse("Unknown");}看一段代码:public static String getChampionName(Competition comp) throws IllegalArgumentException {    if (comp != null) {        CompResult result = comp.getResult();        if (result != null) {            User champion = result.getChampion();            if (champion != null) {                return champion.getName();            }        }    }    throw new IllegalArgumentException("The value of param comp isn't available.");}让我们看看经过Optional加持过后,这些代码会变成什么样子。public static String getChampionName(Competition comp) throws IllegalArgumentException {    return Optional.ofNullable(comp)            .map(c->c.getResult())            .map(r->r.getChampion())            .map(u->u.getName())            .orElseThrow(()->new IllegalArgumentException("The value of param comp isn't available."));}还有很多不错的使用姿势,比如为空则不打印可以这么写:string.ifPresent(System.out::println);

参考资料:《Java 8 in Action: Lambdas, streams, and functional-style programming》 Raoul-gabriel Urma (作者), Mario Fusco (作者), Alan Mycroft (作者)

作者:文烁
点击 阅读更多 查看更多详情

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java8实用技能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java8实用技能

大概一年多之前,我对java8的理解还仅限一些只言片语的文章之上,后来出于对函数式编程的兴趣,买了本参考书看了一遍,然后放在了书架上,后来,当我接手大客户应用的开发工作之后,java8的一些工具,对我的效率有了不小的提升,因此想记录一下ja
2023-06-02

怎么在Java8中使用Collectors实现一个求和功能

怎么在Java8中使用Collectors实现一个求和功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。自定义工具类public class MyCollectors { p
2023-06-06

Java8 Optional用法和最佳实践

Java 8中的Optional是一个可以包装任意类型对象的容器类,用于处理可能为空的值,以避免出现空指针异常。以下是使用Java 8 Optional的一些常见用法和最佳实践:1. 创建Optional对象:- 使用`of`方法创建一个包
2023-09-21

Java8使用lambda实现Java的尾递归

前言本篇介绍的不是什么新知识,而是对前面讲解的一些知识的综合运用。众所周知,递归是解决复杂问题的一个很有效的方式,也是函数式语言的核心,在一些函数式语言中,是没有迭代与while这种概念的,因为此类的循环通通可以用递归来实现,这类语言的编译
2023-05-30

MySQL从库实用技能(一)-

想必从库异常中断的情况不在少数,其中报错信息中1032及1062的错误占了不少的比重错误1032指的是从库中找不到对应行的记录错误1062指的是主键冲突遇到此报错时,大多DBA会使用如下方法进行处理1 手动处理方法一: 找出引起异常的数据然后手动在从库处理后重
MySQL从库实用技能(一)-
2017-04-18

Java8怎么利用Stream实现列表去重

这篇文章主要介绍“Java8怎么利用Stream实现列表去重”,在日常操作中,相信很多人在Java8怎么利用Stream实现列表去重问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java8怎么利用Stream
2023-06-30

Java8中方便又实用的Map函数总结

java8之后,常用的Map接口中添加了一些非常实用的函数,可以大大简化一些特定场景的代码编写,提升代码可读性,快跟随小编一起来看看吧
2022-11-16

Java8中怎么利用Stream实现函数式接口

这期内容当中小编将会给大家带来有关Java8中怎么利用Stream实现函数式接口,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。函数式接口什么是函数式接口?简单来说就是只有一个抽象函数的接口。为了使得函数式
2023-06-16

Java8利用stream流实现递归遍历树形结构

利用stream流实现递归遍历树形结构 1. 什么是树形结构 下面用一张图片说明: 在这张表中,每条数据分别有自己的id和parentId,这些数据通过父与子不断连接,形成了一个树结构。 2. 如何通过stream流处理树形结构 我们最终
2023-08-30

Java8中一个极其强悍的新接口,非常实用

使用注解@FunctionalInterface标识,并且只包含一个抽象方法的接口是函数式接口。函数式接口主要分为Supplier供给型函数、Consumer消费型函数、Runnable无参无返回型函数和Function有参有返回型函数。

提升Ruby面向对象编程技能的实用技巧

在当今的编程世界中,Ruby面向对象编程(OOP)已经成为了一项必不可少的技能。它不仅能够提高代码的可读性和可维护性,还能够使开发过程更加高效和灵活。本文将为您详细介绍如何在Ruby中实现高效的面向对象编程,并使用SEO标签来优化您的文章内容。首先,让我们了解一下什么是面向对象
提升Ruby面向对象编程技能的实用技巧
ruby2024-12-14

你可能不知道的 Npm 实用技巧

Npm 最初只是Node.js 的包管理器,但随着前端技术的不断发展,它的定位变成了广义的包管理器,可以实现JavaScript、React、Vue、Gulp、移动开发等包管理,是目前最大、生态最为健全的包管理器。
NpmNode.js2024-12-01

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录