java8 函数式编程
我们非常高兴地在jOOQ博客上宣布一个客座帖子,该帖子由HSH Nordbank的高级软件工程师Daniel Dietrich (三人的丈夫和父亲)撰写。 他目前作为项目负责人和首席开发人员为金融产品创建定价框架。
除工作外,他还对编程语言,高效算法和数据结构感兴趣。 Daniel撰写了有关使用Java和Scala的Play框架构建Web应用程序的简短书《 Play Framework Starter》 ,并且最近正在创建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
java8 函数式编程