java 基础包的功能
Java 8彻底改变了Java。 它很可能是过去10年中最重要的Java版本。 有很多新功能,包括默认方法,方法和构造函数引用以及lambda, 仅举几例 。
更有趣的功能之一是新的java.util.stream
API,正如Javadoc所述,该API支持
元素流上的函数式操作,例如集合上的map-reduce转换
将此新API与lambda表达式结合使用,您将获得简洁而强大的语法,该语法可通过应用投影显着简化代码。
以表面上简单的过滤集合为例。 在这种情况下,将创建一个简单的Message
类型Collection
,如下所示:
创建消息集合
List<Message> messages = new ArrayList<>();
messages.add(new Message("aglover", "foo", 56854));
messages.add(new Message("aglover", "foo", 85));
messages.add(new Message("aglover", "bar", 9999));
messages.add(new Message("rsmith", "foo", 4564));
在此集合中,我想过滤出Message
,其delay
(第3个构造函数参数)大于3,000秒。
在Java 8之前 ,您可以像这样手动阻塞这种逻辑:
过滤旧派风格
for (Message message : messages) {if (message.delay > 3000) {System.out.println(message);}
}
但是,在Java 8中,此工作变得更加简洁。 集合现在支持stream
方法,该方法将基础数据结构转换为可迭代的对象流,从而允许使用lambda表达式的新型功能操作。 这些操作大多数也可以链接在一起。 这些可链接的方法称为“ 中间” ,不能链接的方法称为“ 终端” 。
简而言之,lambda表达式与匿名类非常相似,只是语法更少 。 例如,如果您查看Javadocs中Stream
的filter
方法的参数,您将看到它采用了Predicate
类型。 但是,您不必像在使用匿名类的Java 8之前那样实现该接口。 因此,用于过滤所有大于3000的delay
值的Predicate
lambda表达式为:
Lambda表达式
x -> x.delay > 3000
其中x
是为流中的每个值传递的参数, ->
右边的所有内容都是要计算的表达式。
将所有这些放到Java 8中可以得出:
流lambdas!
messages.stream().filter(m -> m.delay > 3000).forEach(item -> System.out.println(item));
有趣的是,由于Java 8的其他一些新功能, forEach
的lambda可以进一步简化为:
流lambda更短!
messages.stream().filter(m -> m.delay > 3000).forEach(System.out::println);
由于forEach
lambda的参数仅由println
,因此Java 8现在允许您完全删除该参数。
之前,我提到过流允许您链接lambda-在上述情况下, filter
方法是一种中间方法,而forEach
是一种终端方法。 功能程序员可以立即识别的其他中间方法是: map
, flatMap
和reduce
,仅举几例。
详细地说,我想查找所有延迟超过3,000秒的Message
,并总结总延迟时间。 没有功能魔术,我可以写:
Prosaic Java
long totalWaitTime = 0;
for (Message message : messages) {if (message.delay > 3000) {totalWaitTime += message.delay;}
}
尽管如此,使用Java 8和一些function-foo,您可以实现更优雅的代码构造,如下所示:
Java 8优雅
long totWaitTime = messages.stream().filter(m -> m.delay > 3000).mapToLong(m -> m.delay).sum();
请注意,我如何链接filter
和mapToLong
方法以及终端sum
。 顺便说一句, sum
方法需要一种特定的地图样式方法,该方法可以产生基本类型的集合,例如mapToLong
, mapToInt
等。
将功能样式编程作为一种核心语言功能,是一种非常强大的结构。 并且,尽管许多技术已在各种第三方库(如Guava)和JVM语言(如Scala和Groovy)中提供,但拥有这些语言核心的功能肯定会吸引更多的开发人员,并对开发前景产生最大的影响。
毫无疑问,Java 8极大地改变了Java语言 。
翻译自: https://www.javacodegeeks.com/2014/03/java-8s-functional-fomentation.html
java 基础包的功能