上次出现…我写了一篇与JDK8为我们提供的新方法有关的文章。 最令我兴奋的功能是lambda。 我必须承认,在即将成为浪子的第一年(在此期间,我使用C#开发了该产品),我喜欢LINQ和它可以做的漂亮,优雅的事情。 现在,即使擦除仍然在我们上次离开的地方,现在我们有了更好的过滤,更改,遍历集合以及语法糖旁边的方法,这也可能使您正确使用四核处理器你向朋友吹牛。 在谈论朋友时,这篇文章是与lambda和流处理相关的术语摘要,当他们问您:“ <DKD 8中与lambdas相关的那个地名>是什么? 我无意提供完整列表或lambda指南,如果我说错了什么或错过了什么,请告诉我...
功能界面:
根据[jls 8],功能接口是仅具有一个抽象方法的接口,因此表示单个功能协定(在某些情况下,此“单个”方法可以采用具有等效等效签名的多个抽象方法的形式( [jls7_8.4.2])从超级接口继承;在这种情况下,继承的方法在逻辑上表示单个方法。
@FunctionalInterface
–用于指示接口应为功能接口。 如果注释放置在实际上不是的接口上,则会发生编译时错误。
例如:
interface Runnable { void run(); }
Runnable
接口是一个非常合适的示例,因为当前存在的唯一方法是run方法。 功能接口的另一个Java“经典”示例是Comparator <T>接口,在下面的示例中是前面提到的接口,并且equals方法继承自Object ,该接口仍然起作用,因为compare方法是唯一的抽象方法,而equals继承自超类。
interface Comparator<T> {boolean equals(Object obj);int compare(T o1, T o2);}
流
流 –根据[牛津词典],在计算中是连续的数据或指令流,通常具有恒定或可预测的速率。
从JDK 8 流开始,代表一种机制,用于通过计算管道从数据源传送元素。 流可以用作数组,集合,生成器功能,I / O通道的数据源。 获取流:
- 从
Collection
通过stream()
和/或parallelStream()
方法; - 通过
Arrays.stream(Object[])
从数组 - 从流类的静态工厂方法开始,例如
Stream.of(Object[])
,IntStream.range(int, int)
或Stream.iterate(Object, UnaryOperator)
; - 可以从
BufferedReader.lines();
获得文件的行BufferedReader.lines();
- 可以从Files中的方法获取文件路径流。
- 可以从
Random.ints();
获得随机流Random.ints();
- JDK中的许多其他流承载方法,
including BitSet.stream()
,Pattern.splitAsStream(java.lang.CharSequence)
和JarFile.stream()
。
流操作 – 对流执行的操作。 从流操作的角度来看,有两种类型的操作:中间操作和终端操作
流中间操作 –缩小流内容的操作。 中间操作本质上是惰性的–实际不更改流的内容,而是创建另一个更窄的流。 仅在调用终端操作时才开始流的遍历。
- filter –根据提供的谓词过滤流
- map –通过将映射函数应用于初始流中的每个元素来创建新流(每种数字类型的对应方法:int,long,double)
- flatMap –一种操作,其作用是对流的元素进行一对多转换,然后将结果元素展平为新的流。 例如,如果订单是采购订单流,并且每个采购订单都包含一个订单项集合,则以下内容将生成一个订单项流:
orderStream.flatMap(order -> order.getLineItems().stream())
- 与众不同–返回不同的操作流
- 已排序–返回已排序操作流
- peek –调试专用的方法,该方法返回由该流元素组成的流,所提供的操作在每个元素上执行
例如:
list.stream().filter(filteringFunction).peek(e -> {System.out.println("Filtered value: " + e); });.map(mappingFunction).peek(e -> {System.out.println("Mapped value: " + e); });.collect(Collectors.intoList());
- limit –返回当前流的截断版本(不超过元素的限制数量)
- substream –返回一个由剩余元素组成的流,该元素从起始位置开始,或者在startPosition和endPosition之间
流终端操作 –遍历流以产生结果或副作用。 执行完终端操作后,该流被视为已消耗(在已消耗的流上调用另一个操作将抛出IllegalStateException
)。 终端操作本质上是急切的,除了iterator()
和splititerator()
为那些在API中找不到所需功能的人提供了扩展机制。
- forEach –将提供的操作应用于流的每个元素。 也存在forEachOrdered版本
- toArray –将流的元素提取到数组中
- 减少–减少方法
- 收集-可变还原法
- min –计算流的最小值
- max –计算流的最大值
- count –计算流中的元素
- anyMatch –如果存在与提供的条件匹配的元素,则返回true
- allMatch –如果所有元素都匹配,则返回true
- noneMatch –如果所有元素都不匹配,则返回true
- findFirst –查找与提供的条件匹配的第一个元素
- findAny –返回流中的元素
流管道 :由一个源,随后的零个或多个中间操作和一个终端操作组成。
分离器 –用于遍历和分配源元素的分离器。 可以将其用于遍历,估计元素数量或将其拆分为多个拆分器
归约 –归约运算(或折叠)采用一系列输入元素,并通过重复应用组合运算将它们组合成单个汇总结果。 归约运算可以是计算总和,最大值,最小值,计数或收集列表中的元素。 简化操作也可以并行化,只要所使用的函数是关联的且无状态的即可。 用于减少的方法是reduce()
例如:使用和减少:
int sum = numbers.stream().reduce(0, (x,y) -> x + y);
要么
int sum = numbers.stream().reduce(0, Integer::sum);
可变归约 –是一种在处理流中的元素时将输入元素累积到可变结果容器(StringBuilder或Collection)中的操作。
例如:
String concatenated = strings.reduce("", String::concat)
谓词 –确定输入对象是否符合某些条件的功能接口
我希望这个精简的列表对您有所帮助,并且在您需要在一页上使用所有这些术语的时候将其保留在书签中。
如果您发现缺少的东西,请告诉我,以便纠正。
所以……我希望您有个不错的降临时间,并祝您生日快乐/快乐/快乐,但最重要的是,祝您圣诞节平安!
翻译自: https://www.javacodegeeks.com/2013/12/a-conversational-guide-for-jdk8s-lambdas-a-glossary-of-terms.html