[Java 8] (10) 使用Lambda完成函数组合,Map-Reduce以及并行化

本文介绍了如何在Java 8中使用Lambda表达式进行函数组合,实现Map-Reduce操作,并讨论了如何将这些计算并行化。通过案例展示了将面向对象与函数式编程结合,简化代码并提高程序效率。文章还探讨了并行化的优势及在选择串行或并行执行时应考虑的因素。
摘要由CSDN通过智能技术生成

Java 8中同时存在面向对象编程(OOP)和函数式编程(FP, Functional Programming)这两种编程范式。实际上,这两种范式并不矛盾,只是着重点不同。在OOP中,着重于通过丰富的类型系统对需要解决的问题进行建模;而FP中则着重于通过高阶函数和Lambda表达式来完成计算。所以我们完全可以将这两者融合在一起,对问题提出更加优雅的解决方案。

在这篇文章中,会介绍如何通过函数组合(Function Composition)来将若干个函数单元组合成一个Map-Reduce模式的应用。同时,还会介绍如何将整个计算过程并行化。

使用函数组合

在使用函数式编程的时候,函数是组成程序的单元。通过将函数以高阶函数的形式组织,可以有效地提高不变性(Immutability),从而减少程序的状态变化,最终让并行化更加容易。

下面这张图反映了,纯粹的面向对象设计和混合式设计(面向对象和函数式)的风格。


在OOP中,对象的状态会随着程序的进行而不断发生变化,但是对象始终只有一个。 而在FP中,对象每次被一个函数处理之后,都会得到一个新的对象,而原来的对象并不会发生变化。

下面是一个小例子,让你对这种混合式的编程范式有一个初步的了解。假设我们有一些股票的代码,需要得到股票价格大于100美元的股票并对它们进行排序:

public class Tickers {
    public static final List<String> symbols = Arrays.asList(
        "AMD", "HPQ", "IBM", "TXN", "VMW", "XRX", "AAPL", "ADBE",
        "AMZN", "CRAY", "CSCO", "DELL", "GOOG", "INTC", "INTU",
        "MSFT", "ORCL", "TIBX", "VRSN", "YHOO");
}

对于每只股票代码,可以通过调用下面这段程序借助Yahoo提供的Web Service来得到对应的股价:

public class YahooFinance {
    public static BigDecimal getPrice(final String ticker) {
        try {
            final URL url = new URL("http://ichart.finance.yahoo.com/table.csv?s=" + ticker);
            final BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
            final String data = reader.lines().skip(1).findFirst().get();
            final String[] dataItems 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值