本文是Java8函数式编程的最后一个章节,到此我们的Stream相关的讲解就暂时告一段落。

本文中我将带领读者朋友一起学习一下Stream高级编程相关的知识。

规约与汇总

Stream操作中有两个相对高阶的概念,分别为规约和汇总。

规约(reduce)

将Stream流中元素转换成一个值

汇总(collect)

将Stream流中的元素转换成一个容器,如Map 、List 、 Set

上文我们已经讲过了汇总操作Collect,此处我们重点讲讲规约操作(reduce)

Read More

上文中主要学习了Stream编程中的中间操作,本文我们接着分析终端操作,它分为短路和非短路操作。

我们提前明确一个原则:一个流一旦经过终端操作,就不能进行后续操作了。

allMatch: 检测所有元素是否满足断言,如果都满足返回true,有一个不满足返回false

@Test
public void allMatchTest() {
    boolean isMatch = list.stream()
            // 打印出部门商品名称即结束,参考打印结果
            .peek(sku -> System.out.println(sku.getSkuName()))
            // allMatch是短路操作
            .allMatch(sku -> sku.getTotalPrice() > 100);
    System.out.println(isMatch);
}

运行结果:

无人机
VR一体机
牛仔裤
false

Read More

我始终认为通过案例学习是最好的掌握一个技能的方式,因此我们还是通过之前文章中的案例,对Stream编程中涉及到的具体的方法进行详细的学习。

初始化数据

首先初始化一个List集合,用于后续讲解所用。

List<Sku> list;

@Before
public void init() {
    list = CartService.getCartSkuList();
}

我们仍旧使用之前的购物车数据

Read More

本文,我们开始进入到Java8的Stream流编程概念及实际使用方式的学习。

什么是流(Stream)?

Stream流是jdk1.8引入的新成员,通过声明式的方式处理集合数据(多通过lambda表达式方式进行展示)

它能够将基础操作链接起来,从而完成复杂的数据处理流水线

它也为开发者提供了透明的并行处理

《Java8实战》一书的解释为

流,是从支持 数据处理操作 的 源 生成的元素序列

Read More

本章节中,我们通过一个实战案例对比原始集合操作与Stream集合操作具体有哪些不同,直观地展示Stream集合操作对编程效率的提升。

案例:对比原始集合操作与Stream集合操作

需求场景:

针对上面的购物车,我们想要

  1. 全局查看购物车中都有哪些商品
  2. 将购物车中的图书类商品进行过滤(删除图书类商品)
  3. 在其余商品中挑选两件最贵的
  4. 打印出上述两件商品的名称和总价

Read More

这是一个新的系列,主要讲Java8的lambda编程以及Stream流式编程相关的用法和案例。

这个系列脱胎于一个内部的分享,由于篇幅较长,内容较多,因此拆分成多篇文章进行发布,方便自己后续参考,也希望能够帮到读者朋友。

在这里重点感谢慕课网的 《告别996,开启Java高效编程之门》 课程。

本文是Java8函数式编程系列的第一篇,我们一起学习一下Java8函数式编程的基本概念及操作。

1.概述Lambda表达式

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

使用 Lambda 表达式可以使代码变的更加简洁紧凑。

Read More

zookeeper作为分布式系统中重要的协调组件,在后端开发中是难以绕开的一个重要知识领域。

可以说,只要在后端领域,比如说Java开发、大数据开发中呆过三年及以上的工程师,或多或少都接触过或者直接使用过zookeeper。

因此笔者开启本系列,作为自己学习zookeeper(后文均称为zk)的记录,如果能够启发读者那就更好不过了。

zookeeper概述

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。

它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

度娘如是说。

zookeeper,直译过来就是动物园管理员,之所以这么说,主要是因为它在大数据技术栈中扮演了重要的协调角色。

在hadoop技术栈中,各种技术的logo都是小动物,而zookeeper的官方logo也是一位园丁模样的男士。这也直观的告诉了使用者,zk的用途和角色。

一言蔽之,zk就是在分布式系统中,对应用提供一致性保证,分布式选主,通过各种机制,对应用进行协调,从而使分布式系统对外提供某种特定的服务。

zookeeper官方形象

Read More

作为开发者,除了能够实现书写代码实现产品需求外,还应当具备一定的运维能力。

这其中就包含了环境搭建能力,能够在一台只装有操作系统的服务器上,搭建起应用的基础运行时环境,搭建并运维中间件。

本文持续更新,将介绍基于centos7.6环境,从零搭建Java微服务运行时环境及搭建并运维相关中间件。

Read More

有段时间没写东西了,再不写就有点说不过去了。

今天我们讨论一个轻松的话题,来聊聊RocketMQ中的死信队列

是什么是死信队列

在之前的文章中,我们聊过RocketMQ的消息重试机制。

如果消息消费失败,消费者返回Reconsume_later给RocketMQ broker,队列会按照重试时间窗口对消息进行重试。

当达到最大重试次数(默认16次),消息还是消费失败,RocketMQ不会将该消息丢弃而是会把它保存到私信队列中。

这种不能被消费者正常处理的消息我们一般称之为 死信消息(Dead-Letter Message),将存储死信消息的队列称之为 死信队列(Dead-Letter Queue,DLQ)

Read More

Fork me on GitHub