【发布时间】:2016-09-04 13:57:00
【问题描述】:
Java 8 流 api 是一个非常好的功能,我非常喜欢它。让我紧张的一件事是,90% 的时间我都希望将输入作为集合,将输出作为集合。结果是我必须一直调用stream() 和collect() 方法:
collection.stream().filter(p->p.isCorrect()).collect(Collectors.toList());
是否有任何 java api 可以让我跳过流并直接对集合进行操作(如 c# 中的linq?):
collection.filter(p->p.isCorrect)
【问题讨论】:
-
请注意,
(p->p.isCorrect())写成(MyClass::isCorrect)更正确。 -
@BoristheSpider,为什么更正确?
-
@AndrewTobilko 一个 lambda 可能需要创建一个
static方法,或者最坏的情况是一个匿名的class。使用方法引用意味着这些都不是必需的。 -
@BoristheSpider:我刚刚测试过,方法引用似乎会导致匿名类与 lambda 完全一样。 (具体来说,我写了
System.out.println(((Callable<String>) this::toString).getClass())和System.out.println(((Callable<String>) () -> toString()).getClass()),它们都打印了class com.example.Foo$$Lambda$1/13451323之类的东西。)你能解释一下为什么你认为它们不同吗? -
@Boris the Spider:运行时生成的类没有区别。由于在方法参考案例中没有生成的方法,效率上只有轻微的差异,但这种轻微的性能差异不允许将这些备选方案中的任何一个归类为“更正确”。
标签: java java-8 java-stream