【问题标题】:Testing Lambda in Java 8在 Java 8 中测试 Lambda
【发布时间】:2014-04-21 00:03:08
【问题描述】:

我在搞乱 Java 8 lambda,我试图做以下事情,但显然我做错了什么。我有一个字符串数组String [] q,我试图调用一个静态方法,该方法为数组中的每个元素返回一组Node 对象。 这是我写的:

Set<Set<Node>> sets = Arrays.asList(q).stream().forEach(InMemoryGraph::getAllPredicates);

getAllPredicates 是一个接受 String 作为参数并返回 Set&lt;Node&gt; 的方法 我需要使用java.util.function 吗?任何建议表示赞赏。

【问题讨论】:

  • 可以肯定的是,getAllPredicates 是一个静态方法,对吧?

标签: java lambda java-8 java-stream


【解决方案1】:

所以:

  • 您有一个要流式传输的数组:Arrays.stream(q)
  • 那么你想将每个字符串映射到一组节点:.map(InMemoryGraph::getAllPredicates)
  • 并将这些集合收集到一个集合中:.collect(toSet());

一口气:

Set<Set<Node>> sets = Arrays.stream(q) //a Stream<String>
                       .map(InMemoryGraph::getAllPredicates) // a Stream<Set<Node>>
                       .collect(toSet()); // a Set<Set<Node>>

注意:您需要静态导入 Collectors.toSet

【讨论】:

  • 不知何故编译器不喜欢InMemoryGraph::getAllPredicates,它一直要求定义一个名为InMemoryGraph的局部变量或字段,这是类的名称。 getAllPredicates 是该类中的公共静态方法。有什么想法吗?
  • 你可能需要导入类吗?
  • 您也可以尝试等效的 lambda:.map(s -&gt; InMemoryGraph.getAllPredicates(s)) 并查看您收到的消息。你能确认方法签名是public static Set&lt;Node&gt; getAllPredicates(String s)吗?
  • 这一行在同一个类的另一个静态方法中。我也使用了s -&gt; InMemoryGraph.getAllPredicates(s),它说创建一个名为s的局部变量!!
  • @Arsham 您确定要为 Java 8(而不是 Java 7)编译吗?你有没有设法用 lambda 创建一个简单的程序?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多