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

时间:2017-09-20 09:18:50

标签: 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()

正如您所看到的,我将两次调用相同的lambda表达式但使用不同的“consumer”(AB)。有没有解决方案来避免这种重复?

3 个答案:

答案 0 :(得分:5)

定义一种方法,如果您在调用方法时不介意调用Collection,则采用相应类型的Stream(或parameter.stream()}:

Set<String> reuse(Collection<SomeType> collection) {
  return collection.stream().filter().map().collect();
}

然后调用:

final Set<String> first = reuse(A);
final Set<String> second = reuse(B);

答案 1 :(得分:5)

首先:示例代码中有没有 lambdas。

您只显示两个链式方法调用,最终创建Set

从这个意义上讲,给出示例代码的是有意义的:放置 common 部分

return someCollection.stream().filter().map().collect()

成小帮手方法。也许比Andy概述的要复杂得多 - 因为我希望你所谈论的 lambdas 实际上被用作调用filter()map()的参数。在这种情况下,您可以创建辅助方法的那些参数。

但是就我避免代码重复而言 - 你应该只在底层&#34;语义&#34;时创建这样一个帮助方法。这两个用例真的相同。

答案 2 :(得分:-1)

您可以使用Predicate作为类型。

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

并像

一样使用它
A.stream().filter(someFilter);