Java Functional Programming–IntFunction

我们可以先来看一下这个IntFunction接口源码

@FunctionalInterface
public interface IntFunction<R> {

    /**
     * Applies this function to the given argument.
     *
     * @param value the function argument
     * @return the function result
     */
    R apply(int value);
}

下面我们使用一段简单的程序来使用一下这个接口

        Map<Date, String> map = new HashMap<>(3);
        map.put(new Date(), "1");
        map.put(new Date(), "2");
        map.put(new Date(), "3");

        Date[] dates = map.keySet().toArray(Date[]::new);

上面的代码就是简单地把map中的key用数组收集起来了。我们需要深入一点再看一下这个toArray()方法:

    default <T> T[] toArray(IntFunction<T[]> generator) {
        return toArray(generator.apply(0));
    }

我们再一下API文档:

Params:
generator – a function which produces a new array of the desired type and the provided length

Posted in fp

《Java 9 Concurrency Cookbook》阅读小结

每次我看书都是有“冲动”的缘由的,这次看这本书也不例外。客观上讲作为一名Java程序员,如果一开始就上来看java多线程,java并发编程很可能会打击你的信心,我记得我很久之前就买过一本关于java多线程编程的纸质书——《Java并发编程实战》

这本书我当时看了一点点就基本上放弃了,不是我觉得这本书写得不好,而是我实在没有办法看完,因为里面有太多的东西,我都没有见过。所以很长时间以来,我觉得那个多线程编程很高级,别人一谈及“高并发,线程安全”等等问题,我都也只是听一听,略当了解。

其实在技术道路上我也有自己的箴言——你不知道那门技术,那是因为那门技术蒙了一层面纱,学习新技术就是揭开面纱的过程。这是一种乐观的心态,因为总是有“谣言”说学习是一件痛苦的事情,学习是件寂寞的事情。而我们的乐观心态会促使我们有一种新的体验——就像过去新郎揭开新娘的面纱一样,我们是拥有着激动的心颤抖的手的状态,热烈而好奇,紧张而激动,期待着美好。

然而时间还是悄悄地过去了3年,这段时间我开始接触到了Java多线程编程,还有就是经常听到的“高并发”,其实除了在API层或者在网关层我们使用一些技术去应对高并发,在java层面我们写的Java业务代码也是需要应对高并发,实现多线程编程的。尽管java一直在简化我们多线程编程的难度,但是我们作为Java多线程编程的学习者和实践者,我们还是需要了解一下整个Java多线程技术的发展史和体系结构。

也是机缘巧合,我看了这本《Packt.Java.9.Concurrency.Cookbook.2nd.Edition.2017.4》

之前的那本《 Java并发编程实战 》我借给之前的同事看了,然后我就网上找原版的(最近一直在看英文版技术书),找是找到了结果由于排版问题看得比较不是很舒服,我就偶然搜索到上面这本书。本来是想着看看写的怎么样,之前我看的英文书主要是O’Reilly 或者Manning出版的,这次是第一次看Packt出版的书。

这本书的写作风格大致是分5步讲一个Recipe
Getting ready
How to do it…
How it works…
There’s more…
See also
看起来排版清楚,组织合理,而且还是讲代码的,中间会穿插对代码的解释。所以一路看下来也是水到渠成的,很自然,就没有想过要中途放弃。最后我也是把里面的代码看完了然后”native”了一下上传到了github上。

总体而言,这本书还是很值得读一下的。我结合我自己的理解先说说java多线程开发的历史。

在Java 1.0就引入线程Thread类、 Runnable接口,然后Java 到了1.5时,Java迎来一个值得历史纪念版本Java 1.5, 在这本版本中多线程编程就简化了很多,提供了很多了工具类或者说是底层代码。之前多线程编程时经常需要使用到synchronized关键字,然后就是从Object中继承过来的wait(), notify(),notifyAll(),现在有了轻量级的同步机制volatile关键字,还有整个juc(java.util.concurrent)包。当然juc里面还分了atomic和locks子包。Lock(锁机制就是这时候引入的),还有我们说的AtomicInteger(原子整数),支持原子操作,对应的是我们常看见的i++。同时还引入了阻塞队列、并发集合、线程池。然后Java到了 1.7时,又引入了一个新的Fork/Join 框架,然而如果你不了解juc,你可能也就只是停留在听说过这个词,最多知道这个框架是把任务大的化为小的,如果还是大了,就再化小,依次进行。然后Java到了 1.8(以后都叫java 8\ java 9\ java 10 …), java进一步简化并发编程,引入Stream,同时开启多线程处理的任务就“简单”了很多,在API调用层面,基本上看不到线程/线程池/同步/锁等等一些列“底层”的东西,我们只需要”简单”地调用一下parallel()就可以并行地去处理任务。然后到了java 9, 又引入了一个VarHandle,可能你没有直接用过。

这段简史我虽然只用了一段文字来概括,因为里面的内容很多,随便挑一个估计都会说上半天。

我们在来总览一下这边本书——
《Packt.Java.9.Concurrency.Cookbook.2nd.Edition.2017.4 》,我们可以先看一下目录

一共分了11章:
第一章:线程管理
第二章:基本线程同步
第三章:线程同步工具类
第四章:线程执行器
第五章:Fork/Join 框架
第六章:并行和响应式流
第七章:并发集合
第八章:定制并发类
第九章:测试并发应用
第十章:额外信息
第十一章:并发编程设计

上面的内容组织也基本上是按照我之前提到的java中多线程编程的发展历史一一展开的除了把并发集合放到了后面。这本书主要是讲应用和概念,所以在深度上不是特别投入,但是足够你了解juc,让你揭开这层面纱。

看完之后我们对java中juc这个包以及里面的绝大数的类有一个认识,但是在实际工作中我们可能会遇到一些应用上的问题,这些书只是一个理论基础,包括其中的源码也是一样。

我们先简单看一下juc包

这是总览,再看一下atomic子包

最后看一下locks子包

看完这本书后,就不会对juc这个包下这么多的类和接口感到陌生了,更多了应该是熟悉,因为基本上都直接或者间接用过一边了。我们现在可以这么看,先看接口,然后再看实现类就比较清晰了。

先看这张基本图:

由于之前是 Runnable ,没有返回值,现在是 Callable 带有返回值T,所以在上面的图中我把FutureTask显示出来,这样就体现 了对Thread扩展开放。

再看一张关于并发集合的图:

再瞄一眼一个有趣的类的层次结构:

关于线程池我们也可以看一眼:

记在最后:看完全书,你会有一个比较好的总览概念,就像juc的鸟瞰图一样,当然这是并发编程的一个偏介绍性知识,还有很多比较深的东西,比如原理之类的,还是需要深入到源码层面和实际工作的应用才会有更深的体会。
流年笑掷,未来可期

那些年看过的技术书籍

下面是我近两年来看过的一些书籍,这些书籍主要是PDF版,所以我就很方便的截图了,还有一些书籍是曾经购买的纸质书籍,那些书籍大都是因为太出名,或者因为是情怀购买的,现在就我个人而言是不喜欢购买纸质书籍,更喜欢在大屏的显示器上看书,主要是因为可以边看边敲敲代码,还有就是搬家的时候绝对有帮助。如果书是纸质书籍,我想我看的话,估计只会去看非技术书籍了。关于PDF版的书籍我推荐一个网站—— https://salttiger.com/ 那里面全是英文书籍,如果你喜欢看英文原版的话,你绝对会喜欢的。

我截图的时候没有特别注意顺序,不过我的个人学习路线基本是Java->Spring->Spring Cloud -> Docker -> Kubernetes ; 中间穿插了一些MicroService, Spring Data, FP,Redis; 如果细分Java的话,其实我截的图远不够,毕竟这只是我近两年的书,我的主要编程语言还是Java,所以下面的书籍中只有关于Java 8,9 等新特性的书籍,比如Stream API. 如果是Java初学者我想我曾经看过的有《Java开发技术大全– 刘新 》、《Java核心技术 卷1 基础知识 原书第9版》、《Java核心技术卷II高级特性(原书第9版)》,这几本书都还可以,其实看完第一本,基本上对Java会有一定的认知的,剩下的就是实践。



下面五本书是很经典的书籍,如果你喜欢纸质书,你可能看过吧。没有的话,请摸一摸你的情怀。

此图像的alt属性为空;文件名为image-6.png