使用Javaslang进行Java 8中的函数式编程

我们非常高兴地在jOOQ博客上宣布一个客座帖子,该帖子由HSH Nordbank的高级软件工程师,三个孩子的父亲, Daniel Dietrich撰写。 他目前作为项目负责人和首席开发人员为金融产品创建定价框架。

丹尼尔·迪特里希

除工作外,他还对编程语言,高效算法和数据结构感兴趣。 Daniel撰写了简短的书《 Play Framework Starter》 ,内容涉及使用Java和Scala的Play框架构建Web应用程序,并一直在创建Javaslang,这是Java 8的功能组件库,最近引起了我们的兴趣。

当我听说Java将获得lambda时,这真是一个激动人心的时刻。 使用函数作为抽象手段的基本思想起源于80年前的“ lambda演算”。 现在,Java开发人员可以使用函数传递行为。

List<Integer> list = Arrays.asList(2, 3, 1);

// passing the comparator as lambda expression
Collections.sort(list, (i1, i2) -> i1 - i2);

Lambda表达式大大降低了Java的冗长性。 新的Stream API弥补了lambda和Java集合库之间的空白。 仔细观察显示,并行流很少或至少谨慎使用。 流无法重用,并且烦恼的是必须将集合前后转换。

// stream a list, sort it and collect results
Arrays.asList(2, 3, 1)
  .stream()
  .sorted()
  .collect(Collectors.toList());
        
// a little bit shorter
Stream.of(2, 3, 1)
  .sorted()
  .collect(Collectors.toList());

// or better use an IntStream?
IntStream.of(2, 3, 1)
  .sorted()
  .collect(ArrayList::new, List::add, List::addAll);

// slightly simplified
IntStream.of(2, 3, 1)
  .sorted()
  .boxed()
  .collect(Collectors.toList());

哇! 这些是一些用于对整数列表进行排序的变体。 通常,我们想专注于什么,而不是把头放在如何做上 。 不需要额外的复杂性。 这是使用Javaslang达到相同结果的方法

List.of(2, 3, 1).sort();

通常,每种面向对象的语言都有一个命令式核心,Java也是如此。 我们使用条件语句和循环来控制应用程序的流程。

String getContent(String location) throws IOException {
    try {
        final URL url = new URL(location);
        if (!"http".equals(url.getProtocol())) {
            throw new UnsupportedOperationException(
                "Protocol is not http");
        }
        final URLConnection con = url.openConnection();
        final InputStream in = con.getInputStream();
        return readAndClose(in);
    } catch(Exception x) {
        throw new IOException(
            "Error loading location " + location, x);
    }
}

功能语言使用表达式而不是语句,我们认为是值。 Lambda表达式可帮助我们转换值。 这是一个使用Javaslang的Try示例:

Try<String> getContent(String location) {
    return Try
        .of(() -> new URL(location))
        .filter(url -> "http".equals(url.getProtocol()))
        .flatMap(url -> Try.of(url::openConnection))
        .flatMap(con -> Try.of(con::getInputStream))
        .map(this::readAndClose);
}

结果是包含内容的Success或包含异常的Failure 。 通常,与命令式风格相比,此概念更加简洁,并且可以生成我们可以推理的健壮程序。

希望这篇简短的介绍引起您对javaslang.com的关注 ! 请访问该站点以了解有关使用Java 8和Javaslang进行函数式编程的更多信息。

翻译自: https://www.javacodegeeks.com/2015/05/functional-programming-in-java-8-with-javaslang.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值