Java 重用同一lambda表达式的一部分

Java 重用同一lambda表达式的一部分,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我有以下情况: //Case 1 final Set<String> first = A.stream().filter().map().collect() //Case 2 final Set<String> second = B.stream().filter().map().collect() //案例1 最终设置优先=A.stream().filter().map().collect() //案例2 最终设置秒=B.stream().filte

我有以下情况:

  //Case 1
  final Set<String> first = A.stream().filter().map().collect()

  //Case 2
  final Set<String> second = B.stream().filter().map().collect()
//案例1
最终设置优先=A.stream().filter().map().collect()
//案例2
最终设置秒=B.stream().filter().map().collect()

如您所见,我两次调用相同的lambda表达式,但使用不同的“consumer”(
A
B
)。是否有避免这种重复的解决方案?

您可以使用
谓词作为类型,例如

Predicate<String> someFilter = e -> e == e; // or something more smart

定义一个方法,采用适当类型的
集合
(或者
,如果您不介意在调用该方法时调用
参数.Stream()
):

Set重用(集合){
返回collection.stream().filter().map().collect();
}
然后像这样调用:

final Set<String> first = reuse(A);
final Set<String> second = reuse(B);
final Set first=重用(A);
最终设置秒=重复使用(B);

首先:示例代码中没有lambda

您只显示两个链式方法调用,创建一个
,作为最终结果

从这个意义上讲,给出示例代码后唯一有意义的事情是:放置公共部分

转化为一个小助手方法。可能比Andy所描述的要复杂一点——因为我认为您所讨论的lambda实际上被用作调用
filter()
map()
的参数。在这种情况下,您可以创建helper方法的那些参数


但是,正如我所说的避免代码重复一样,只有当两个用例的底层“语义”完全相同时,才应该创建这样的助手方法

这里的表达式
A
B
的类型是什么?您可以将所有这些绑定到一个方法中,然后调用它。相同类型,抱歉。我忘了提了。是的,但是什么类型的?这很明显。我想知道是否还有更“花哨”的东西。如果你有一些东西是有效的,而且正如你所说的“显而易见”,为什么你需要花哨的东西呢?我的意思是,你可以把它定义为一个
函数fn=c->c.stream().filter().map().collect()在使用它的方法内部;但那不是很混乱吗?只是出于好奇。我会接受你的回答。这是正确的答案,大致上是我在问题的第一个评论中提到的。这不是OP所问的。他明确要求采用一种可重用的方法来应用
.stream()。在对象上收集()
,如
A
B
是,已理解。但是我会接受安迪·特纳的回答,因为他是第一个这么做的。非常感谢你的澄清,我很好。安德斯的回答总是很好的,他值得每一点的声誉。猜猜谁是第一个对他的答案投赞成票的人。。。
Set<String> reuse(Collection<SomeType> collection) {
  return collection.stream().filter().map().collect();
}
final Set<String> first = reuse(A);
final Set<String> second = reuse(B);
return someCollection.stream().filter().map().collect()